if(z[0]='0')continue 也写错了
不是打击你,你的代码太滥了,实在不想去找错误,给你我以前写的代码吧,你自己整理一下
#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]//字符转模散换成数字
char * charset//代表数字的字符
/*功能:设置使用那些字符表示数字,默认历誉的为"0123456789ABCDEF"*/
/*参数:*/
/*返回值:*/
void init(char * s)
{
int i
if(s==NULL)
charset = "0123456789ABCDEF"
else
charset = s
for(i=0i<256i++)
c2d[i] = 0
for(i=0charset[i]i++)
c2d[charset[i]] = i
}
/*功能:清除前导零旦烂氏*/
/*参数:需要清楚的数字*/
/*返回值:清零后数字的位数*/
int clearZeros(char * a)
{
int i,j
for(i=0a[i]==charset[0]i++)
for(j=0a[i]i++,j++)
a[j] = a[i]
a[j] = 0
if(j==0)
{
a[j++] = charset[0]
a[j] = 0
}
return j
}
/*功能:乘,用于进制转换之类*/
/*参数:a 和 b 分别为乘数,结果保存到 r , d 为使用的进制*/
/*注意:r 可以等于 a , b一定要小于d, 如果被乘数有前导0 则结果也会有前导0*/
/*返回值:结果的位数*/
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=0a[i]i++)
len = k = i
for(c=0,i--,r[k--]=0i>=0 i--,k--)
{
t = c2d[a[i]] * b + c
c = t/d
r[k] = charset[t%d]
}
if(c)
{
for(i=len,j=++leni>=0i--,j--)
r[j] = r[i]
r[0]=charset[c]
}
return len
}
我用C语言写了一个,在如启VC2005下测试通过。#include <stdio.h>
#include <string.h>
typedef unsigned char CHAR
typedef unsigned int UINT
/*十进制形式的a与b,注意低位在前高位在后*/
CHAR a[10000]/*被乘数*/
CHAR c[20000]/*乘积和乘数*/
UINT temp1,temp2/*用来存放中间结果*/
UINT da, db/*记录a和b的位兆迟数*/
/*清零*/
void Zero( CHAR* x, UINT n )
{
UINT i
for ( i = 0i <ni ++ )
x[i] = '0'
}
CHAR CharToNum( CHAR c )
{
return c - 0x30
}
CHAR NumToChar( CHAR c )
{
return c + 0x30
}
/*这个函数模拟大整数的左移*/
void LShift( CHAR* x, int digits )
{
UINT i
for ( i = 0i <digits - 1i ++ ) {
x[i] = x[i+1]
}
x[digits] = 0
}
/*这个乘法函数计算大整数a与给定的y的乘积,乘积加入c右半部*/
void OneDigitMultiply( UINT y )
{
UINT i
UINT cm = 0/*乘法进位*/
UINT ca = 0/*加法进位*/
if ( y != 0 ) {
for ( i = 0i <dai ++ ) {
/*乘*/
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 {
/*如果被乘数本位是0就直接返回*/
return
}
}
/*这个函数用来输出*/
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("输入被乘数:")
scanf("%s",a)
printf("输入乘数:")
scanf("%s",c)
/*记录位数*/
da = strlen( (const char*)a )
db = strlen( (const char*)c )
/*反转以使低位在前*/
strrev( (char*)a )
strrev( (char*)c )
UINT i
/*a与b存储的是char字符,减去0x30就能直接渣猜如当数字使用了*/
for ( i = 0i <10000i ++ ) {
if ( a[i] != '\0' ) {
a[i] = CharToNum( a[i] )
}
}
for ( i = 0i <20000i ++ ) {
if ( c[i] != '\0' ) {
c[i] = CharToNum( c[i] )
}
}
/*这个乘法算法可以参看二进制乘法器的原理*/
for ( i = 0i <dbi ++ ) {
OneDigitMultiply( c[0] )
LShift(c, 20000)
}
c[10000-db-1] = 'x'/*给数字尾部作个标记*/
OutputResult()
getchar()
getchar()
}
第二题:
#include <stdio.h>
void main()
{
float a
scanf("%f",&a)
if ( a - (int)a == 0 ) {
printf("是整数\n")
}
else {
printf("不是整数\n")
}
getchar()
getchar()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)