C语言用MA和有一种

Python018

C语言用MA和有一种,第1张

10 判断部分 是a=b+c 这个是赋值 于是

先计算a=b+c=0+0=0 条件不成立

执行else 输出$$$

选D

11 先执行if(a<b) 即1<3成立,

执行if(c<d) 即5<4不成立

执行else

判断a<c 即1<5 成立

判断b<d 即3<4成立

执行x=2

输出x值为2

选B

12 先判断w<x 即1<2成立

于是表达式值就是w的值

也就是1

选D

/*

size_a,pa——指向数组a的有效末端

ma——a的最大容量,必须大于na

n=12——求n的阶

p——求阶乘时的当前乘数

*/

#include

#define

Ma

10000

int

pa/*指向数组a的有效末端*/

int

p=2

int

memory_over=0

union

data

{

unsigned

long

int

b

struct

{unsigned

l:16

unsigned

h:16

}m

}a[Ma]

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明1:考虑到result比较长,我用a[Ma].b来存储n!的result,每一位a[pa].b能存储4位10进制数字。

因为我定义的数组是静态的,所以Ma应该足够大。

ps:其实只用定义一个unsigned

long

int

b[Ma]就可以了(直接用b[pa]代替a[pa].b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

unsigned

int

cashe

unsigned

int

carry

void

main()

{

unsigned

int

n/*求n的阶*/

void

facto(unsigned

int

n)

printf("Input

n:")

scanf("%u",&n)

/*=================开始求阶乘!=============*/

a[0].b=1/*初始化*/

facto(n)

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明2:上面这句直接调用facto(n)来求n!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*========================以下是显示最后结果====================================*/

if(memory_over==0)

{printf("the

result

include

%dNO:\n",pa+1)

printf("%u",a[pa--].m.l)

for(pa>=0pa--)

printf("%04u",a[pa].m.l)

printf("\n")

}

getch()

}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明2:求阶函数facto(n)说明:

这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa].b与阶数p相乘一次,直到乘完n为止!

{multiple()

p++/*每一轮乘一个阶数p*/

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

void

facto(unsigned

int

n)

{void

multiple()

pa=0

while(pa<Ma-1&&p<=n)/*容量限制*/

{multiple()

p++/*每一轮乘一个阶数p*/

}

if(p<=n)

{printf("memory

out!\n")memory_over=1}/*如果当前的存储结果的数组a[Ma]不够用!应提高Ma*/

}

/*==============================================================================

算法说明3:乘法函数multiple()说明:负责a[pa].b与阶数p相乘。

a[pa].b有很多结点,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。

当然是从低结点a[0].b开始不断与p相乘,产生的“进位”加到高位a[1].b,直到a[pa].b*p为止!

随着结果数值增大,pa个结点的a[].b可能容纳不下结果,所以如果a[pa].b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:

if(carry>0)

a[++pa].b=carry

===================================================================================*/

void

multiple()

{int

i=0

carry=0

while(i<=pa)/*i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘*/

{a[i].b=a[i].b*p+carry/*计算结果,要考虑来自低位的进位*/

carry=a[i].b/10000/*计算进位*/

a[i].b=a[i].b%10000/*计算余数*/

i++

}

if(carry>0)

a[++pa].b=carry

}

程序没有错呀,你输入的520,反着输出就成了025,输出整数就是25了!

ma%10就是得到ma的个位数

ma/10%10就得到ma的十位数

ma/100就得到ma的百位数