%运算:r=a%b,即a=k*b+r。其中k为某整数,r的绝对值范围为[0,b-1],其符号与a保持一致,除非其为0.
(a*b)%c=(a%c*b%c)%c (a+b)%c=(a%c+b%c)%c
数位拆解是把一个给定数字各个数位上的数字拆开。
特殊乘法:对2个小于1000000000的输入,求结果。123*45=1*4+1*5+2*4+2*5+3*4+3*5
样例输入:123 45 样例输出:54
思路:只需对x做整数除,使x除以10,即可将十位上的数字移动到个位,百威到十位,其他依次类推。重复求个位数字的方法,即得到移动到个位上的十位数字。不断的重复对x除以10,对10求模,即可得到数字x各个数位上的数字。
#include<stdio.h> int main() { int a,b; while (scanf("%d%d",&a,&b)!=EOF) { int buf1[20],buf2[20],size1=0,size2=0;//分别保存从两个数字中拆解出来的数位数字,其数量由size1.size2表示 while (a!=0)//数位拆解,只要a依然大于0就不断重复拆解过程 { buf1[size1++]=a%10;//取得当前个位上的数字,将其保存 a/=10;//将所有数位上的数字移动到高一位上 } while (b!=0)//拆解第二个数字 { buf2[size2++]=b%10; b/=10; } int ans=0;//计算答案 for(int i=0;i<size1;i++) for(int j=0;j<size2;j++) ans+=buf1[i]*buf2[j]; printf("%d\n",ans); } return 0; }
上面完成数位拆解使用数学方法,也可绕过数学原理,转而采用,把输入数据当字符串的技巧,直接将两个数字以字符串的形式保存起来,再依此遍历这个字符串,通过字符串与字符'0'的ascii值得差来计算字符所表示的数值,从而完成数位拆解。
#include<stdio.h> int main() { char a[11],b[11]; while (scanf("%s%s",a,b)!=EOF) { int ans=0; for(int i=0;a[i]!=0;i++) for(int j=0;b[j]!=0;j++) ans+=(a[i]-'0')*(b[j]-'0'); printf("%d\n",ans); } return 0; }进制转换:输入不超过整形定义的非负10进制整数A和B,输出A+B的 m 进制数 。
输入:每个测试用例占一行,给出m和A B的值,输出A+B的m进制数.
样例输入:
8 1300 48
2 1 7
0
输出:2504 1000
思路:m进制转换成n进制:1.从m进制转换成10进制。2.从10 进制转换成n进制。当要求十进制数x的k进制表示时,我们只需对x不断重复的求余求商,即可由低到高依次得到各个数位上的数。反过来,要求得有k进制数表示的十进制数,我们需要依次计算各个数位上数字与该位权重的积,并累加。
#include<stdio.h> int main() { long long a,b;//使用数据类型long long确保不会溢出 int m; while(scanf("%d",&m)!=EOF) { if(m==0) break;//当m等于0时退出 scanf("%lld%lld",&a,&b);//用%lld对long long变量赋值 a=a+b; int ans[50],size=0;//用ans来保存依次转换得到的各个数位数字的值,size表示其个数 do//依次求得各个数位上的数字 { ans[size++]=a%m; a/=m; }while(a!=0);//当a不等于0的时候重复对m求余,除以m的过程 for(int i=size-1;i>=0;i--)//从高位到低位输出 printf("%d",ans[i]); printf("\n"); } return 0; }数值转换://求任意两个不同进制非负整数的转换,所给整数在long范围 ,不同进制表示符为0~9,a~f或者0-9,A-F
//输入 a ,n,b。n是a进制数转换为b进制数。输出字符均为大写
样例输入:15 Aab3 7
样例输出 210306
#include<stdio.h> #include<string.h> int main() { int a,b; char str[40]; while(scanf("%d%s%d",&a,str,&b)!=EOF) {//tmp为将要计算的a进制对应的十进制数,lenth为字符串长度方便我们从低高位遍历每个数位上的数 //c为各个数位的权重初始化为1,表示最低位权值为1,之后每一位权重是前一位的a倍 int tmp,lenth=strlen(str),c=1; for(int i=lenth-1;i>=0;i--)//从低微到高位遍历每个数位上的数字 { int x; if (str[i]>'0'&&str[i]<'9') {//当字符在0到9之间,计算其代表的数字 x=str[i]-'0';} else if(str[i]>='a'&&str[i]<='z') {//当字符为小写字母时计算其代表的数字 x=str[i]-'a'+10;} else //当字母为大写 时,计算其代表的数字 x=str[i]-'A'+10; tmp+=x*c;//累加该位数字与该位权重的积 c*=a;//计算下一位数位权重 } char ans[40],size=0;//用ans保存转换到b进制的各个数位数字 do { int x=tmp%b;//计算该数位 ans[size++]=(x<10 )? x+'0':x-10+'A';//将该数位转换为字符 tmp/=b; }while(tmp); for(int i=size-1;i>=0;i--) { printf("%c",ans[i]); } printf("\n"); } return 0; }