这个问题需要对字符与整数的来回转变要非常熟悉,不然一下转不过弯来!!!
当看到题目给的值的取值范围很大时,一般想到大数的加减乘除:
I-numberhttp://acm.hdu.edu.cn/showproblem.php?pid=4608
不解释,只要看到这个 The length of x will not exceed 105.就知道了
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<string> 5 using namespace std; 6 int main() 7 { 8 char a[200005]; 9 int h,s,i,d,t; 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%s",a); 14 d=strlen(a); 15 for(;;) 16 { 17 h=0; 18 s=0; 19 for(i=d-1;i>=0;i--) 20 { 21 if(a[i]!='9') 22 break; 23 else 24 { 25 a[i]='0';h++; 26 } 27 } 28 if(d-1-h<0) 29 { 30 d++; 31 for(i=d-1;i>0;i--) 32 a[i]=a[i-1]; 33 a[0]='0'; 34 } 35 a[d-1-h]=a[d-1-h]+1; 36 for(i=d-1;i>=0;i--) 37 { 38 s=s+a[i]-48; 39 } 40 if(s%10==0) 41 {printf("%s ",a);break;} 42 } 43 } 44 return 0; 45 }//这里使用字符串数组来进行加法的,但是用整型数组来算会清晰,不用注意太多细节。
Power of Cryptographyhttp://poj.org/problem?id=2109
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(void) 5 { 6 double n, p; 7 while(scanf("%lf%lf", &n, &p) != EOF) 8 { 9 printf("%.lf ", pow(p, 1/n)); 10 } 11 return 0; 12 }
首先,题目中的数据强度并不弱,这一点确实如题目中所说:“For all such pairs 1<=n<= 200, 1<=p<10101,所以,double型是不能精确地表示出所给数据,但是却能表示出一个近似值。
当向double型变量中存入
4357186184021382204544
然后再输出,得到的是
4357186184021382000000
后六位的值变为了0,这一点和int型变量是有很大区别的。也就是说当存入double型变量的值超出了它的精度表示范围时,将低位的数据截断。(关于浮点数在计算机中的表示方法,百度吧…讲的蛮清楚的。)
在本题中,如果测试数据为:
7 4357186184021382204544
实际上所处理数据是:
7 4357186184021382000000
拿4357186184021382000000开7次方的结果自然就是1234。
为什么不是1233或者1235呢?
12337=4332529576639313702577
12347=4357186184021382204544
12357=4381962969567270546875
可以看出在double型所能表示的精度范围内,它们三个值已经不同了。
所以,此题中的测试数据也都是类似于上述情况,所以才能使用double型开n次方的方法。
注意double的精度约为1^-300-1^300,注意神奇的pow函数