ZOJ - 1210 的大整数乘法
题目:https://vjudge.net/contest/201179#problem/B
思路:
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
using namespace std;
int la;
int lb;
int lc;
int ling;
int a[100];
int b[100];
int c[100];
int n;//指数
void jie(int x){
n=1;
memset(b,0,sizeof(b));
b[0]=x;
while(1)
{
if(b[lb-1]==a[la-1] && lb==la) break;//在x得n次方中只要长度相同,最高为相同,n必唯一 .
bool flag=0;
for(int i=0;i<lb;i++)//大整数乘法
{
b[i]=b[i]*x; //
}
for(int i=0;i<lb;i++)//
{
b[i+1]+=b[i]/10;//这里很重要
if(b[lb-1]>=10){//
flag=1; //
}
b[i]=b[i]%10; //
}
if(flag){
lb++;
}
n++;
}
}
void suan(int x)
{
memset(c,0,sizeof(c));
c[0]=x;
lc=1;
bool flag;
for(int i=1;i<n;i++)
{
flag=0;
for(int j=0;j<lc;j++)//同样用大整数乘法乘n次x.
{
c[j]=c[j]*x;
}
for(int j=0;j<lc;j++)
{
c[j+1]+=c[j]/10;
if(c[lc-1]>=10){
flag=1;
}
c[j]=c[j]%10;
}
if(flag){
lc++;
}
}
}
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
using namespace std;
int la;
int lb;
int lc;
int ling;
int a[100];
int b[100];
int c[100];
int n;//指数
void jie(int x){
n=1;
memset(b,0,sizeof(b));
b[0]=x;
while(1)
{
if(b[lb-1]==a[la-1] && lb==la) break;//在x得n次方中只要长度相同,最高为相同,n必唯一 .
bool flag=0;
for(int i=0;i<lb;i++)//大整数乘法
{
b[i]=b[i]*x; //
}
for(int i=0;i<lb;i++)//
{
b[i+1]+=b[i]/10;//这里很重要
if(b[lb-1]>=10){//
flag=1; //
}
b[i]=b[i]%10; //
}
if(flag){
lb++;
}
n++;
}
}
void suan(int x)
{
memset(c,0,sizeof(c));
c[0]=x;
lc=1;
bool flag;
for(int i=1;i<n;i++)
{
flag=0;
for(int j=0;j<lc;j++)//同样用大整数乘法乘n次x.
{
c[j]=c[j]*x;
}
for(int j=0;j<lc;j++)
{
c[j+1]+=c[j]/10;
if(c[lc-1]>=10){
flag=1;
}
c[j]=c[j]%10;
}
if(flag){
lc++;
}
}
}
int main()
{
puts("Problem 4 by team x");
char s[100];
while(scanf("%s",s)==1)
{
printf("\n1 / %s =\n", s);
lb=1;
la=0;
ling=0;
int l=strlen(s);
while(s[l-1]=='0'){
ling++;
l--;
}
if(l==1 && s[0]=='1'){
for(int i=0;i<ling;i++)
{
printf("0");
if(i==0) printf(".");
}
printf("1\n");
continue;
}
for(int i=0;i<l;i++)
{
a[i]=(int)s[l-i-1]-48;
la++;
}
ling+=la;
if(a[0]==5) {
jie(5);suan(2);
}
else {
jie(2);suan(5);
}
for(int i=0;i<ling;i++)//先输出0
{
printf("0");
if(i==0) printf(".");
}
for(int i=lc-1;i>=0;i--)//记住最高为在最后
{
printf("%d",c[i]);
}
printf("\n");
}
puts("End of problem 4 by team x");
return 0;
}
{
puts("Problem 4 by team x");
char s[100];
while(scanf("%s",s)==1)
{
printf("\n1 / %s =\n", s);
lb=1;
la=0;
ling=0;
int l=strlen(s);
while(s[l-1]=='0'){
ling++;
l--;
}
if(l==1 && s[0]=='1'){
for(int i=0;i<ling;i++)
{
printf("0");
if(i==0) printf(".");
}
printf("1\n");
continue;
}
for(int i=0;i<l;i++)
{
a[i]=(int)s[l-i-1]-48;
la++;
}
ling+=la;
if(a[0]==5) {
jie(5);suan(2);
}
else {
jie(2);suan(5);
}
for(int i=0;i<ling;i++)//先输出0
{
printf("0");
if(i==0) printf(".");
}
for(int i=lc-1;i>=0;i--)//记住最高为在最后
{
printf("%d",c[i]);
}
printf("\n");
}
puts("End of problem 4 by team x");
return 0;
}