解题思路:
指数叠加的大整数运算。
注意事项:
题目上说的n<10100这一句应该是打错了,。我把程序查来查去查不出错。后来把输入的int改成字符串,设了200位,就通过了。
参考代码:
#include<stdio.h>
#include<string.h>
int xx(char *a,char *b,char *c)
{
int i,j,t=0,k;
for(i=0;b[i]!=NULL&&i<100;i++)
{
for(j=0;a[j]!=NULL&&j<100;j++)
{
if(i+j<100)
{
if(c[j+i]==NULL)
{
c[j+i]='0';
if(j+i+1<=100)
c[j+i+1]=NULL;
}
t=(c[j+i]-'0')+(a[j]-'0')*(b[i]-'0');
c[j+i]=t%10+'0';
t=t/10;
k=j+i+1;
while(t!=0&&k<100)
{
if(c[k]==NULL)
{
c[k]='0';
c[k+1]=NULL;
}
t=t+(c[k]-'0');
c[k]=t%10+'0';
t=t/10;
k++;
}
}
}
}
return 0;
}
int add(char *m,char *nm)
{
int i,t=0,k;
for(i=0;i<200;i++)
{
if(m[i]==NULL&&nm[i]==NULL)
break;
else if(m[i]==NULL)
{
m[i]='0';
m[i+1]=NULL;
}
else if(nm[i]==NULL)
{
nm[i]='0';
nm[i+1]=NULL;
}
t=(m[i]-'0')+(nm[i]-'0');
m[i]=t%10+'0';
t=t/10;
k=i;
while(t!=0)
{
k++;
if(m[k]==NULL)
{
m[k]='0';
m[k+1]=NULL;
}
t=m[k]-'0'+t;
m[k]=t%10+'0';
t=t/10;
}
}
}
int main()
{
// long int bug=0;
int a,b,i,j,p=0,end=0,w=0;
char n[102],t[102],c[102],tempm[102],tempnm[102],mast[102],m[200],nm[200];
char check[200];
scanf("%s",check); //找了好久终于找到了错的地方,,,原来输入问题。
scanf("%d",&b);
j=0;
for(i=(int)strlen(check)-1;i>=0&&j<=100;i--)
{
n[j]=check[i];
j++;
}
n[j]=NULL;
//这里是原本的整型输入
// scanf("%d %d",&a,&b);
m[0]='0';
m[1]=NULL;
nm[0]='1';
nm[1]=NULL;
/*
for(i=0;i<b;i++)
{
n[i]=a%10+'0';
a=a/10;
}
n[i]=NULL;
*/
strcpy(mast,n);
strcpy(t,n);
tempm[0]='1';
tempm[1]=NULL;
for(i=1;i<=b;i++)
{
tempnm[0]=NULL;
c[0]=NULL;
xx(n,t,c);
xx(tempm,t,tempnm);
tempnm[b+1]=NULL;
c[b]=NULL;
add(m,nm);
p=0;
for(j=w;j<b;j++)
{
if(c[j]!=mast[j])
{
i=w;
break;
}
else
{
p=1;
w++;
}
}
if(p==1)
{
strcpy(nm,m);
if(w==b)
{
for(i=(int)strlen(m)-1;i>=0;i--)
{
printf("%c",m[i]);
// bug=bug*10+(m[i]-'0');
}
// printf("%ld",bug);
return 0;
}
strcpy(t,tempnm);
}
strcpy(tempm,tempnm);
strcpy(n,c);
end++;
if(end==100000)
{
break;
}
}
printf("-1");
return 0;
}
0.0分
15 人评分
#include<stdio.h> #include<math.h> int main() { //求32的正整数幂的最后2位循环长度 int n,k,L=1,p=0,sum=0,sum1,sum2,num = 1,a[1000000]; scanf("%d%d",&n,&k); p = n; for(int i=0;i<10;i++){ a[i] = n; n = n*p; } for(int z=0;z<k;z++){ L = L*10; } sum = a[0]; for(int j=1;j<1000000;j++) { if(j>100000){ num = -1; break; } if(sum == a[j]%L) { break; }else{ num++; } } printf("%d\n",num); } 32分 运行错误
各路大神,可否看看我这个哪里出错了 #include<stdio.h> int main() { int n,k,a=0,i,c=1; scanf("%d%d",&n,&k); a=n; for(i=1;i<=k;i++) c=c*10; for(i=1;i<10000;i++) { n*=a; n=n%c; if(a==n)break; } if(a!=n) printf("-1"); else printf("%d",i); }
#include<stdio.h> #include<math.h> void main() { int num,n; int i,l,x=1,w[10000]; scanf("%d%d",&num,&n); if(num<pow(10,n-1)) printf("-1\n"); else { for(i=1;i<=10000;i++) { x*=num; w[i]=x%(int)pow(10,n); if(x>pow(10,n)) x=w[i]; // printf("i=%d,x=%d,w[%d]=%d\n",i,x,i,w[i]); } for(l=1;l<i;l++) { if(w[1]==w[1+l]&&w[1+l]==w[1+2*l]) { printf("%d\n",l); break; } } } } 看看错在何处?总是提示运行错误
看起来不是那么的那么的美观;
不容易系列2 (C语言代码)浏览:699 |
点我有惊喜!你懂得!浏览:2028 |
C语言训练-求PI* (C语言代码)浏览:930 |
永远的丰碑 (C语言代码)浏览:698 |
汽水瓶 (C语言代码)浏览:664 |
2006年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:912 |
哥德巴赫曾猜测 (C语言代码)浏览:1148 |
Pascal三角 (C语言代码)浏览:1252 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1327 |
C语言训练-大、小写问题 (C语言代码)浏览:649 |