C语言题目,2的N次方被3整除

来源:百度知道 编辑:UC知道 时间:2024/05/04 07:02:21
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++)