C语言题目,2的N次方被3整除
人气:
13
【字体:大 中 小】
发布时间:2009-04-09 11:51:37
>>>>>>>>提问printf("%d"n);
休 闲 居 编 辑
>>>>>>>>休闲养生网回答:这个存在溢出问题,大概想了个思路,先给你说一下,上班比较忙,程序等写好了贴上来。
你建立数组num,用于存储2^n,数组num[0]存储2^n的个位,num[1]存储2^n的十位,以此推下去,关键的思路在这里,一个整数i,如果它的各位加和为3的倍数,那么它可以被3整除。这样只要数组num的各个元素相加的和为3的倍数,那么这个n也就计算出来了。这里num[0]可以从2开始,每次n+1,则从num[0]开始num[k]*2;if(num[k]*2>9){num[k+1]+=1;num[k]=num[k]*2-10;},最后一个for从num[0]加到num[m](num[m+1]为数组结束符‘\0’)就是i的各位加和了
这个是纯算法的题目,用的是用加法来降低乘法(或者说是冥级运算的数量级)的方法,同时为了解决c语言溢出的问题,只能用数组来做。
楼主要是看明白了,可以再思考下两个大数相乘的算法,比如两个20位长的数字相乘,甚至更长的两个数相承,还有相除算法,很有意思的:)
=============================================
#include <stdio.h>
#define N 10000//定义2^n最大长度
main()
{
char num[N];
int sum,i,j,n;
i=0;
n=1;
sum=2;
num[0]=2;
num[1]='}';//2^n结束符
while(j!=0&&i<=N)//判断2^n各位数字加和是否能被3整除
{
sum=0;
// printf("process!!\n");
n++;
for(;num[i]!='}';i++)
num[i]*=2;
for(i=0;num[i]!='}';i++)
if(num[i]>9)
{//向高位进位
if(num[i+1]=='}')
{
num[i+2]='}';
num[i+1]=1;
num[i]-=10;
}
else
{
num[i+1]+=1;
num[i]-=10;
}
}
for(i=0;num[i]!='}';i++)
{
printf("num[%d]:",i);
printf("%d\n",num[i]);
}
for(i=0;num[i]!='}';i++)
sum+=num[i];
j=sum%3;//2^n各位数字加和模3
printf("sum:%d\n",sum);
printf("n:%d\n",n);
printf("j:%d\n",j);
}
return 0;
}
=============================================
这里用了“}”来代替“\0”
程序运行起来后,无法跳出while循环,说明没有这样的n存在
从数学的角度来分析,2^n从n=0开始,模3余数为1;n=1,模3余数为2;n=2,模3余数为1;每次n+1,则余数也为原来2倍,而当余数为4时,相当于模3余数为1。以此反复下去,结论是2^n是不能被3整除的...
太遗憾了,太可怕了~~~~
把程序再修改如下
=============================================
#include <stdio.h>
#define N 50//定义2^n最大长度
main()
{
char num[N];
int sum,i,j,n;
i=0;
n=1;
sum=2;
num[0]=2;
num[1]='}';//2^n结束符
while(j!=0&&i<N)//判断2^n各位数字加和是否能被3整除
{
sum=0;
// printf("process!!\n");
n++;
for(i=0;num[i]!='}';i++)
num[i]*=2;
for(i=0;num[i]!='}';i++)
if(num[i]>9)
{//向高位进位
if(num[i+1]=='}')
{
num[i+2]='}';
num[i+1]=1;
num[i]-=10;
}
else
{
num[i+1]+=1;
num[i]-=10;
}
}
for(i=0;num[i]!='}';i++)
{
printf("num[%d]:",i);
printf("%d\n",num[i]);
}
for(i=0;num[i]!='}';i++)
sum+=num[i];
j=sum%3;//2^n各位数字加和模3
if(j==0)
printf("2^%d能被3整除!\n",n);
printf("sum:%d\n",sum);
printf("n:%d\n",n);
printf("j:%d\n",j);
}
printf("定义范围内的2^n不能被3整除!\n");
printf("请修改所定义2^n最大范围后重试!\n");
return 0;
}
=============================================
≡ 查看、发表评论 ≡