用了非常基礎的方法來完成二進制加法(也就是把輸入的兩個數分別存好后,在自定義函式里按位取數,再從后向前相加進位
原本的話大數二進制用字符實作可能更好一些叭。想問一下,撰寫的程式一開始資料型別在全部選擇了int的情況下運行正常,之后我為了避免輸入大數字時超出int的范圍,把所有int都改成了long long ,改完之后再編譯運行就不出結果了otz 這可能是什么原因造成的呢?運算超時嗎?或者是哪里的資料格式不應該用long long 嗎....但是編譯又沒有報錯otz(本來的int輸入小的數還有結果,現在輸什么都沒有結果了(摔
ps:一開始用int的運行結果圖 (用int的話像111111111111111+111111111111這樣的式子就會溢位
如圖,t是輸入的用例組數,兩個數字間用空格分隔

#include<stdio.h>
#include<math.h>
long long weishu(long long a) //計算位數
{
long long ws=0;
while(a) {ws++;a/=10;}
return ws;
}
long long binarysum(long long x,long long y)//加法
{
long long sum=0,a[100000]={0},b[100000]={0},c[100010]={0};
long long i,j,k,wsa,wsb,wsc,ws;
wsa=weishu(x),wsb=weishu(y);
for(i=1;i<=wsa;i++) {a[i]=x%10;x=x/10;} //按位取出
for(j=1;j<=wsb;j++) {b[j]=y%10;y=y/10;}
if(wsa>wsb) wsc=wsa;//取位數較長的那個加數的位數再加一
else wsc=wsb;
for(k=1;k<=wsc+1;k++)//進位
{
c[k]=a[k]+b[k];
if(c[k]<2) continue;
else {c[k]=c[k]-2;a[k+1]+=1;}
}
if(c[k-1]==0) ws=k-2;//第一位如果是0(即之前不發生進位)就位數減一
else ws=k-1;
for(k=ws;k>0;k--)
{
sum+=c[k]*pow(10,k-1);
}
return sum;
}
int main()
{
long long numa[10],numb[10],sum[10];
long long i,j,t,wsa,wsb,ws;
scanf("%lld",&t);//讀取t組用例
for(i=1;i<=t;i++)
{
scanf("%lld %lld",&numa[i],&numb[i]);//輸入兩個加數
wsa=weishu(numa[i]);
wsb=weishu(numb[i]);
if(wsa>=wsb) //自定義函式那里只考慮了a的位數比b多的情況,就直接在這邊分類一下了(好懶
{
sum[i]=binarysum(numa[i],numb[i]);
ws=weishu(sum[i])+2;
printf("%*lld\n+%*lld\n",ws,numa[i],ws-1,numb[i]);//一個糟糕的輸出格式所以用了那么多printf(逃(以下基本都不需要看啦
for(j=1;j<ws;j++) {printf("-");}
printf("-\n");
printf("%*lld\n",ws,sum[i]);
}
else
{
sum[i]=binarysum(numb[i],numa[i]);
ws=weishu(sum[i])+2;
printf("%*lld\n+%*lld\n",ws,numa[i],ws-1,numb[i]);
for(j=1;j<ws;j++) {printf("-");}
printf("-\n");
printf("%*lld\n",ws,sum[i]);
}
}
return 0;
}
uj5u.com熱心網友回復:
小聲(或許有大佬愿意幫我看看嘛.....又改了一些小地方但還是出不來結果(似乎也沒有bug?(只是似乎.jpguj5u.com熱心網友回復:
可以理解為大資料相加,只不過這個大資料可以理解為都是01組成的。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM_LEN 2048
int cal_factorial(unsigned char *num_list, int num_size, int n);
int cal_val(unsigned char *num_list, int num_size, int base, int num)
{
int i = 0, j;
int len = 1, tmp, carry_bit;
num_list[1] = 1;
while (i < num) {
carry_bit = 0;
for (j = 1; j <= len; j++) {
tmp = num_list[j] * base + carry_bit;
num_list[j] = tmp % 10;
carry_bit = tmp / 10;
if (j >= len && carry_bit != 0)
len++;
if (num_size-1 < len) {/* overflow */
printf("Overflow!\n");
return num_size-1;
}
}
i++;
}
return len;
}
int main(void)
{
unsigned char num_list[MAX_NUM_LEN];
int num_len, i;
int base, power;
memset(num_list, 0, sizeof(num_list));
printf("Please input two numbers: ");
scanf("%d%d", &base, &power);
if (base < 0 && power % 2)
num_list[0] = 1; /* negative number */
else
num_list[0] = 0;
base = abs(base);
num_len = cal_val(num_list, MAX_NUM_LEN, base, power);
printf("len = %d\n", num_len);
if (num_list[0])
putchar('-');
for (i = num_len; i >= 1; i--)
printf("%d", num_list[i]);
printf("\n");
return 0;
}
int cal_factorial(unsigned char *num_list, int num_size, int n)
{
int carry_bit, i, j, len = 1;
int tmp;
num_list[1] = 1;
for (i = 2; i <= n; i++)
{
carry_bit = 0;
for (j = 1; j <= len; j++) {
tmp = num_list[j] * i + carry_bit;
num_list[j] = tmp % 10;
carry_bit = tmp / 10;
if (j >= len && carry_bit != 0)
len++;
if (num_size -1 < len) { /* overflow */
printf("Overflow!\n");
return num_size-1;
}
}
}
/*
for (i = len; i >= 1; i--)//逆序輸出陣列就是結果
printf("%d", a[i]);
printf("\n");
*/
return len;
}
供參考~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8108.html
標籤:C語言
下一篇:自編的mmap多行程拷貝檔案問題
