时间限制: 1000 ms 内存限制: 65536 KB
提交数: 1491 通过数: 912
【题目描述】
输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。
【输入】
一个大于0的大整数,长度不超过100位。
【输出】
两行,分别为整数除法得到的商和余数。
【输入样例】
2132104848488485
【输出样例】
164008065268345
0
【来源】
No
【代码】
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t,len,shang[300],yu=0,b[150]={0}; //yu表示余数,shang[300]表示商
char a[150];
gets(a+1);
len=strlen(a+1);
for(int i=1;i<=len;i++)
{
b[i]=a[i]-48;
b[i]=b[i]+yu*10;
yu=b[i]%13; //得到余数
shang[i]=b[i]/13; //得到商
}
for(int j=1;j<=len;j++) //用于删除前导0
{
if(shang[j]!=0)
{
t=j;
break;
}
}
for(t;t<=len;t++) //此时t=j
{
cout<<shang[t];
}
cout<<endl;
cout << yu<< endl;
return 0;
}
【解题思路】
难点:如何得到商、删除前导0
1.如果你现在已经做了前面的高精度算法,这道题已经不算难了,要处理的是怎么得到余数和商,因为余数就是一个简单的数字,余数直接用变量表示就行了,而商却是一串数字,所以要用数组表示。
int t,len,shang[300],yu=0,b[150]={0}; //yu表示余数,shang[300]表示商
2.在做除法运算的时候,余数直接通过被除数取13的模就可以了,但是要注意被除数在被除之前要加上上一位的余数,不懂可以在草稿本上看一下除法是怎么进行的;直接是被除数除以13就可以了。
for(int i=1;i<=len;i++)
{
b[i]=a[i]-48;
b[i]=b[i]+yu*10;
yu=b[i]%13; //得到余数
shang[i]=b[i]/13; //得到商
}
3.不管是多大的数,一定会有前导0的,因为13>10是个10位,而数组b[1](第一个数字)是一个个位,所以一定会有前导0,此时要删除前导0,一直删到shang的当前位置不为0时位置,用break直接跳出循环。
for(int j=1;j<=len;j++) //用于删除前导0
{
if(shang[j]!=0)
{
t=j;
break;
}
}