#includestdio.h
創(chuàng)新互聯(lián)公司擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站維護(hù)、四川樂山服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球成百上千家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
void mul(int,int,int); ? ? ?//沒有返回值的話就用void,還有,你要在后面定義函數(shù)的話 ? ? ?
int count; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//先在前面聲明
int main()
{
int a,b,c;
a=19;
b=22;
c=650;
mul(a,b,c);
printf("count=a*b*c=%d\n",count);
return 0;
}
void mul(int x,int y,int z)
{
count=x*y*z;
}
#includestdio.h
#includestring.h
#includemalloc.h
#define N 100//最大100位
/* 函數(shù)聲明 */
void calc1(char* str1,int len1,int* tmp,int m);
void accumulate(int cnt,int* res,int res_len,int* tmp,int tmp_len);
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len);
int main()
{
int i,j;
/* 獲取計(jì)算數(shù)據(jù)(可以從文件中讀取) */
char str1[N]={NULL};
char str2[N]={NULL};
char result[N*N]={NULL};
printf("Input Num1: \n");
scanf("%s",str1);
fflush(stdin);
printf("Input Num2: \n");
scanf("%s",str2);
/* 計(jì)算兩個(gè)字符串的長(zhǎng)度,及存儲(chǔ)結(jié)果所需要的空間 */
int len1=strlen(str1),len2=strlen(str2);
int len=len1+len2;
/* 計(jì)算并輸出計(jì)算結(jié)果 */
printf("The result is: %s\n",bignum_multi(str1,len1,str2,len2,result,len));
return 0;
}
/*===============================================================
調(diào)用calc1和accumulate函數(shù)計(jì)算大數(shù)相乘
===============================================================*/
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len)
{
int i,j,m=0,cnt=0,*tmp,*res;
/* 分配臨時(shí)結(jié)果的存放空間 */
tmp=(int*)malloc((len1+1)*sizeof(int));
res=(int*)malloc(len*sizeof(int));
/* 初始化兩個(gè)數(shù)組 */
for(i=0;ilen1;i++)
tmp[i]=0;
for(j=0;jlen;j++)
res[j]=0;
for(i=len2-1;i=0;i--)
{
/* 獲取乘數(shù)中第i位的值 */
m=str2[i]-'0';
/* 計(jì)算被乘數(shù)與第i位的乘積,結(jié)果保存在tmp整型數(shù)組中 */
calc1(str1,len1,tmp,m);
/* 將tmp數(shù)組中的值加到res數(shù)組中 */
cnt++;
accumulate(cnt,res,len,tmp,len1+1);
}
/* 將整形數(shù)組res中的值轉(zhuǎn)化成字符串存入result中 */
i=0;j=0;
/* 去掉res中第一個(gè)非零數(shù)字前的零 */
while(res[i++]==0);
for(m=i-1;mlen;m++,j++)
result[j]=res[m]+0x30;
result[j]='\0';
free(tmp);
free(res);
return result;
}
/*===============================================================
計(jì)算被乘數(shù)與乘數(shù)的某一位的乘積
===============================================================*/
void calc1(char* str1,int len1,int* tmp,int m)
{
/* d兩個(gè)位的乘積結(jié)果,remainder余數(shù),carry進(jìn)位 */
int i,d=0,remainder=0,carry=0;
/* 從被乘數(shù)字符串'\0'的前一位算起 */
for(i=len1-1;i=0;i--)
{
d=str1[i]-'0';
d*=m;
remainder=(d+carry)%10;
carry=(d+carry)/10;
tmp[i+1]=remainder;
}
if(carry)
tmp[0]=carry;
else
tmp[0]=0;
}
/*===============================================================
將被乘數(shù)與乘數(shù)中一位數(shù)字的乘積結(jié)果計(jì)入res數(shù)組中
===============================================================*/
void accumulate(int cnt,int* res,int len,int* tmp,int len1)
{
int m=0,n=0,i,k,remainder=0;
static int carry=0;
for(k=len1-1,i=0;k=0;k--,i++)
{
m=tmp[k];
n=res[len-cnt-i];
if(m+n+carry=10)
{
remainder=(m+n+carry)%10;
carry=1;
}
else
{
remainder=m+n+carry;
carry=0;
}
res[len-cnt-i]=remainder;
}
}
//#include
stdafx.h
//此頭文件不可丟
#include
stdio.h
#include
string.h
#define
N
200
//預(yù)編譯將后面數(shù)組的的長(zhǎng)度定義為200;
int
main()
{
void
GetDigits(int
a[],
char
s[]);
void
multiply(int
a[],
int
b[],
int
c[]);
char
s1[N],
s2[N];
//起初定義兩個(gè)字符串?dāng)?shù)組s1和s2,用來存儲(chǔ)兩個(gè)相乘的大數(shù);
int
i,
j,
a[N],
b[N],
c[N
*
2];
printf("\n
input
number
a:
");//輸入兩個(gè)數(shù)字的字符串;
scanf("%s",
s1);
printf("\n
input
number
b:
");
scanf("%s",
s2);
//把輸入的字符串,按位存放到數(shù)組
GetDigits(a,
s1);
GetDigits(b,
s2);
multiply(a,
b,
c);
//找到最高位
j
=
N
*
2
-
1;
while(c[j]
==
0)
j--;
//打印計(jì)算結(jié)果
printf("\n
%s
*
%s=",
s1,
s2);
for(i
=
j;
i
=
0;
i--)
printf("%d",
c[i]);
return
0;
}
//下面Getsights函數(shù)的目的是把字符串形式的數(shù)字按位存放到數(shù)組
void
GetDigits(int
*a,
char
*s)
{
int
i;
char
digit;
int
len
=
strlen(s);
for(i
=
0;
i
N;
i++)
a[i]
=
0;
for(i
=
0;
i
len;
i++)
{
digit
=
s[i];
a[len
-
1
-
i]
=
digit
-
'0';
}
}
//把a(bǔ)*b的結(jié)果存儲(chǔ)到數(shù)組c中,按位表示;
void
multiply(int
*a,
int
*b,
int
*c)
{
int
i,
j;
for(i
=
0;
i
N
*
2;
i++)
c[i]
=
0;
//先把結(jié)果數(shù)組設(shè)置為0;
for(i
=
0;
i
N;
i++)
for(j
=
0;
j
N;
j++)
c[i
+
j]
+=
a[i]
*
b[j];
//
處理進(jìn)位
for(i
=
0;
i
N
*
2
-
1;
i++)
{
c[i
+
1]
+=
c[i]
/
10;
//進(jìn)位累加到高位
c[i]
=
c[i]
%
10;
//該位的最后結(jié)果
}
}
是a[j++]=str1[i]-'0'; 這個(gè)沒看懂嗎?
因?yàn)樽址斎氪娴氖茿SCII碼。所以字符串’0‘其實(shí)在內(nèi)存里不是存的0而且一個(gè)別的數(shù)字。
這里利用到ASCII排序的規(guī)律,只要減去’0‘這個(gè)碼的值就能得到相應(yīng)的字符數(shù)字的對(duì)應(yīng)整形值了。
這個(gè)是ASCII碼的表 你看下就應(yīng)該明白了
我用C語(yǔ)言寫了一個(gè),在VC2005下測(cè)試通過。
#include stdio.h
#include string.h
typedef unsigned char CHAR;
typedef unsigned int UINT;
/*十進(jìn)制形式的a與b,注意低位在前高位在后*/
CHAR a[10000];/*被乘數(shù)*/
CHAR c[20000];/*乘積和乘數(shù)*/
UINT temp1,temp2;/*用來存放中間結(jié)果*/
UINT da, db; /*記錄a和b的位數(shù)*/
/*清零*/
void Zero( CHAR* x, UINT n )
{
UINT i;
for ( i = 0; i n; i ++ )
x[i] = '0';
}
CHAR CharToNum( CHAR c )
{
return c - 0x30;
}
CHAR NumToChar( CHAR c )
{
return c + 0x30;
}
/*這個(gè)函數(shù)模擬大整數(shù)的左移*/
void LShift( CHAR* x, int digits )
{
UINT i;
for ( i = 0; i digits - 1; i ++ ) {
x[i] = x[i+1];
}
x[digits] = 0;
}
/*這個(gè)乘法函數(shù)計(jì)算大整數(shù)a與給定的y的乘積,乘積加入c右半部*/
void OneDigitMultiply( UINT y )
{
UINT i;
UINT cm = 0; /*乘法進(jìn)位*/
UINT ca = 0; /*加法進(jìn)位*/
if ( y != 0 ) {
for ( i = 0; i da; i ++ ) {
/*乘*/
temp1 = ((UINT)a[i]) * y + cm;
cm = temp1 / 10;
temp1 %= 10;
/*加*/
temp2 = ((UINT)c[i+10000]) + temp1 + ca;
if ( temp2 9 ) {
ca = 1;
temp2 -= 10;
} else {
ca = 0;
}
c[i+10000] = temp2;
}
c[da+10000] += cm + ca;
}
else {
/*如果被乘數(shù)本位是0就直接返回*/
return;
}
}
/*這個(gè)函數(shù)用來輸出*/
void OutputResult()
{
CHAR* p = c + 20000;
while( *p == 0 ) {
p --;
}
printf("乘積是:\n");
while( *p != 'x' ) {
printf("%d", *p);
p --;
}
}
void main()
{
Zero( a, 10000 );
Zero( c, 10000 );
printf("輸入被乘數(shù):");
scanf("%s",a);
printf("輸入乘數(shù):");
scanf("%s",c);
/*記錄位數(shù)*/
da = strlen( (const char*)a );
db = strlen( (const char*)c );
/*反轉(zhuǎn)以使低位在前*/
strrev( (char*)a );
strrev( (char*)c );
UINT i;
/*a與b存儲(chǔ)的是char字符,減去0x30就能直接當(dāng)數(shù)字使用了*/
for ( i = 0; i 10000; i ++ ) {
if ( a[i] != '\0' ) {
a[i] = CharToNum( a[i] );
}
}
for ( i = 0; i 20000; i ++ ) {
if ( c[i] != '\0' ) {
c[i] = CharToNum( c[i] );
}
}
/*這個(gè)乘法算法可以參看二進(jìn)制乘法器的原理*/
for ( i = 0; i db; i ++ ) {
OneDigitMultiply( c[0] );
LShift(c, 20000);
}
c[10000-db-1] = 'x'; /*給數(shù)字尾部作個(gè)標(biāo)記*/
OutputResult();
getchar();
getchar();
}
第二題:
#include stdio.h
void main()
{
float a;
scanf("%f",a);
if ( a - (int)a == 0 ) {
printf("是整數(shù)\n");
}
else {
printf("不是整數(shù)\n");
}
getchar();
getchar();
}
dc這個(gè)函數(shù)里面連b這個(gè)參數(shù)都沒有使用,這也能出結(jié)果...,
if(z[0]='0')continue 也寫錯(cuò)了
不是打擊你,你的代碼太濫了,實(shí)在不想去找錯(cuò)誤,給你我以前寫的代碼吧,你自己整理一下
#include stdio.h
int mulx(char * a,int b,char * r,int d);
void init(char * s);
char buf1[4*1024];
char buf2[4*1024];
char buf3[4*1024];
int main()
{
char * a;
char * b;
char * r;
char * t;
int d;
int i;
a = buf1;
b = buf2;
r = buf3;
init(NULL);
while(scanf("%s %d",a,d)!=EOF)
{
mulx(a,d,r,10);
printf("%s\n",r);
}
return 0;
}
char c2d[256]; //字符轉(zhuǎn)換成數(shù)字
char * charset; //代表數(shù)字的字符
/*功能:設(shè)置使用那些字符表示數(shù)字,默認(rèn)的為"0123456789ABCDEF"*/
/*參數(shù):*/
/*返回值:*/
void init(char * s)
{
int i;
if(s==NULL)
charset = "0123456789ABCDEF";
else
charset = s;
for(i=0;i256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}
/*功能:清除前導(dǎo)零*/
/*參數(shù):需要清楚的數(shù)字*/
/*返回值:清零后數(shù)字的位數(shù)*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[i];i++,j++)
a[j] = a[i];
a[j] = 0;
if(j==0)
{
a[j++] = charset[0];
a[j] = 0;
}
return j;
}
/*功能:乘,用于進(jìn)制轉(zhuǎn)換之類*/
/*參數(shù):a 和 b 分別為乘數(shù),結(jié)果保存到 r , d 為使用的進(jìn)制*/
/*注意:r 可以等于 a , b一定要小于d, 如果被乘數(shù)有前導(dǎo)0 則結(jié)果也會(huì)有前導(dǎo)0*/
/*返回值:結(jié)果的位數(shù)*/
int mulx(char * a,int b,char * r,int d)
{
int i,j,k,len;
int c,t;
if(r==NULL)
r = a;
for(i=0;a[i];i++);
len = k = i;
for(c=0,i--,r[k--]=0;i=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}