先计算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的百位数