%运算: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;
}