1、 姓名: 学号: 班级: 指导老师: 学院:计算机学院 1 大数相乘 1. 问题描述 两个比较大数,远远超出long long 类型,相乘,并计算结果。 2. 设计思绪 经过模拟手工计算两数相乘,从低位乘到高位,两重循环,第一重循环控制乘数第i位数和被乘数相乘,第二重循环是被乘数第j位数。第二重循环每循环完一次,再把结果*10和上次结果相加,这里又利用到了大数相加,这么一直处理到第一重循环结束。只要合理处理好进位就能够了。 3. 数据结构设计 把两数每
2、位数存放数组里,经过控制循环实现相乘。
4. 功效函数设计
void nixu()
void mul ();
计算两个存在数组里大数计算相乘结果。
5. 程序代码
#include
3、mp; p ++; q --; } } void mul(char* str1, char* str2) { char result[200]; int l1 = strlen(str1); int l2 = strlen(str2); memset(result,'0',l1+l2); result[l1+l2] = '\0'; nixu(str1, 0, l1-1); nixu(str2, 0, l2-1); int index1; int ind
4、ex2;
for(int i=0;i 5、'0') + temp1 + index2;
index2 = temp2 / 10;
result[i+j] = temp2 % 10 + '0';
}
result[i + l1] += index1 + index2;
}
nixu(result, 0, l1+l2-1);
cout<<"相乘后数字为:"< 6、 }
cout< 7、100 字符,其中:A 、B 、C 、D 、E 、F分别有7 、9 、12 、22 、23、27个)电报报文,实现哈夫曼编码,并求平均编码长度。
2.设计思绪
建立一个哈夫曼树,求编码,再求平均编码长度。
3.数据结构设计
建立一个储存字符出现数目和字符编码后长度
struct Infor{
int weight ;
int length ;
}w[30];
再建立一个储存哈夫曼树结点数据结构
typedef struct{
char ch;
int weight;
int lchild,rchild ,parent;
}Hnode;
4.功效函数设 8、计
void select(const Hnode HT[],int n,int &s1,int &s2)
求数组中权值最小和次小值下标
void HTree(Hnode *huff , Infor w[] , int n)
建立哈夫曼树,编码和编码长度。
5.程序代码
#include 9、nfor{
int weight ;
int length ;
}w[30];
void select(const Hnode HT[],int n,int &s1,int &s2)
{
int i;
s1 = s2 = 0;
int min1 = INT_MAX;//最小值,INT_MAX在 10、选没有父节点最小和次小权值下标
if ( HT[i].weight < min1 )
{
//假如比最小值小
min2 = min1;
s2 = s1;
min1 = HT[i].weight;
s1 = i;
}
else if ( (HT[i].weight >= min1) && (HT[i].weight < min2) )
{
//假如大于等于最小值,且小于次小值
min2 = HT[i].weight;
s 11、2 = i;
}
else
{
//假如大于次小值,则什么全部不做
;
}
}
}
}
void HTree(Hnode *huff , Infor w[] , int n)
{
int m = 2*n-1 ,sum , s1 ,s2 ;
for(int i = 1 ; i <= n ; ++i )
{
huff[i].weight = w[i-1].weight;
huff[i].lchild = huff[i].rchild = huff[i].parent 12、 = -1 ;
}
for(int i = n+1 ; i <= m ; ++i)
{
huff[i].weight = -1;
huff[i].lchild = huff[i].rchild = huff[i].parent = -1 ;
}
if(n != 1)
{
for(int i = 1 ; i <= n-1 ; ++i )
{
select(huff,n+i-1,s1,s2);
sum = huff[s1].weight+huff[s2].weight ;
huff[n+i].weight = sum 13、
huff[s1].parent = huff[s2].parent = n + i ;
huff[n+i].lchild = s1 ;
huff[n+i].rchild = s2 ;
}
}
else
{
w[0].length = 1;
}
for(int i = 1 ; i <= n ; ++i)
{
int k = 0 , c = 0 ;
char temp[10] ;
for( int j = huff[i].parent , k = i ; j != -1 ; k = j , j = huff[j 14、].parent )
{
w[i-1].length++;
if(huff[j].lchild == k)
{
temp[c++] = '0' ;
}
else
{
temp[c++] = '1' ;
}
}
printf("%c 编码为:",i+'A'-1) ;
for(int i = c-1 ; i>= 0 ; --i)
{
putchar(temp[i]) ;
}
puts("") ;
}
}
int main()
{
Hnode huff[60 15、] ;
char str[1000];
w[0].weight = 7 ;
w[1].weight = 9 ;
w[2].weight = 12;
w[3].weight = 22;
w[4].weight = 23;
w[5].weight = 27;
HTree(huff,w,6);
int b=0;
for(int i = 0 ; i < 6 ; ++i)
{
b += w[i].length*w[i].weight;
}
printf("平均编码长度为: %.1f\n",(b*1.0)/6) ;
}
6运行测试






