第5章数组练习题

人民币

输入正整数m,他代表一个人民币的金额(元)。求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。
核心算法:

int money_units[7]={100,50,20,10,5,2,1};
int num[7]={0};
int amount;
cin>>amount;
for(i=0;i<7;i++)
{
	num[i]=amount/money_units[i];
	amount-=num[i]*money_units[i];
}

过程示例:
money=12345;
则12345/100=123(张100);
45/20=2(张20);
5/5=1(张5)。

完整代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>
#include <math.h>
using namespace std;
int main ()
{
	int money_units[7]={100,50,20,10,5,2,1};
	int num[7]={0};
	int amount;
	cin>>amount;
	int pieces =0;
	int i;
	for(i=0;i<7;i++)
	{
		num[i]=amount/money_units[i];
		amount-=num[i]*money_units[i];
		
		}
	for(i=0;i<7;i++)
	{
		if(num[i]>0)
		cout<<num[i]<<"张"<<money_units[i]<<endl;
		pieces+=num[i];
		}	
	cout<<"total pieces="<<pieces<<endl;
	 
	
	return 0;
}

对于for(int i=0;i<7;i++)而言i=1,2 ,6恰好7个循环

选择排序

输入5个整型数字,从小到大排序并输出
核心算法:
在这里插入图片描述

//把后续几个数中的最小值放到第一个,第一个依次设为[0],[1],[2],[3]

	int temp=arr[0];
	for(int j=0;j<4;j++)
	{
		for(int i=j+1;i<5;i++)
		{
			temp=arr[j];
			if(arr[i]<arr[j])
			{
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}	
		}
	}

完整代码

#include <iostream>
using namespace std;
int main ()
{
	int arr[5];
	for(int i=0;i<5;i++)
	{
		cin>>arr[i];
	}
	int temp=arr[0];
	for(int j=0;j<5;j++)
	{
		for(int i=j+1;i<5;i++)
		{
			temp=arr[j-1];
			if(arr[i]<arr[j])
			{
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}	
		}
	}
	
	for(int i=0;i<5;i++)
	{
		cout<<arr[i];
	}
	return 0;
}

折半查找

在有序数列a[10]={5,13,19,21,37,56,64,75,80,92}中查找80:
核心算法:

 	for(int low=0,mid,high=len-1;high>=low;)
 	{
 		mid=(low+high)/2;
 		if(aim==a[mid])
 			cout<<mid+1;
		 else if(aim<a[mid])high=mid-1;
		 else low=mid+1; 
	 }

完整代码:

#include <iostream>
using namespace std;
int main ()
{
	bool isfind=false;
 	int	a[10]={5,13,19,21,37,56,64,75,80,92};
 	int len=10;
 	int aim;
 	cout<<"please cin aim: ";
 	cin>>aim;
 	for(int low=0,mid,high=len-1;high>=low;)
 	//why not "high>low" ?
 	// because: 最终aim是要和mid=(low+high)/2比较大小来判断的,
 	//如果为>,则在aim=high=low的特殊情况下无法得到这个aim。
 	//所以要一直判断到high与low重合才结束。
 	{
 		mid=(low+high)/2;
 		if(aim==a[mid])
 		{
 			cout<<"aim lays at: "<<mid+1;
 			isfind=true;
 			break;
		 }
		 else if(aim<a[mid])high=mid-1;
		 else low=mid+1; 
	 }
	 if(isfind!=true)cout<<"not find";
	return 0;
}

快速排序

在这里插入代码片

字符串替换

在这里插入图片描述
核心代码:

while(is[i]!='\0')
	if(is[i]<'0'||is[i]>'9')
		os[j++]=is[i++];
	else{
		n=is[i++]-'0';
		char temp=n+'a';
		os[j++]=temp;
	}
os[j]='\0';

完整代码:

#include <iostream>
using namespace std;
int main ()
{
	char is[80],os[80];
	cout<<"is=";
	cin>>is;
	int i=0,j=0;
	while (is[i]!='\0')
		if(is[i]<'0'||is[i]>'9')
			os[j++]=is[i++];
		else {
			int n=is[i++]-'0';
			char c='a'+n;//****
			os[j++]=c;
		}
	os[j]='\0';
	cout<<"os="<<os<<endl;
	return 0;
}

学生查询

在这里插入图片描述
输入样例:

wangli
76 78 89 80
liya
87 86 90 70
liya

输出样例:
姓名 总成绩 平均成绩
wangli 323 80.75
liya 333 83.25
请输入需要查询的学生姓名:
liya 87 86 90 70 83.25

在这里插入代码片

二维数组转置

void test2()int main ()
{
	test2();
	return 0;
}
void test2()
{
	int a[3][4];
	int (*p)[4]=a;
	for(int row=0;row<3;row++)
		for(int col=0;col<4;col++)//依次输入各列这一行的
			cin>>*(*(p+row)+col);
			
	for(int col=0;col<4;col++)//这两行上下换一下就好
	{   for(int row=0;row<3;row++)//依次输出各行这一列的
			cout<<setw(3)<<*(*(p+row)+col);//上面的已经改变了,这里自然不用变
		cout<<endl;
	}

书P106习题

1

2罗马钱币

同理于”人民币“
核心算法:

	while(n!=0)
	{
		num[i]=n/units[i];
		n-=num[i]*units[i];
		i++;
	}

完整:

#include <iostream>
using namespace std;
int main ()
{
	int units[7]=           {1000,500,100,50, 10  ,5  ,1};
	char translate_units[7]={'M', 'D','C','L','X','V','I'};
	int num[7]={0};
	int n,i=0;
	cin>>n;
	while(n!=0)
	{
		num[i]=n/units[i];
		n-=num[i]*units[i];
		i++;
	}
	for( i=0;i<7;i++)
	{
		if(num[i]!=0)
		for(int k=0;k<num[i];k++)
		cout<<translate_units[i];
	}
	return 0;
}

3 10_to_2 :

点这里

4 3*4矩阵转置:

void test2()int main ()
{
	test2();
	return 0;
}
void test2()
{
	int a[3][4];
	int (*p)[4]=a;
	for(int row=0;row<3;row++)
		for(int col=0;col<4;col++)//依次输入各列这一行的
			cin>>*(*(p+row)+col);
			
	for(int col=0;col<4;col++)//这两行上下换一下就好
	{   for(int row=0;row<3;row++)//依次输出各行这一列的
			cout<<setw(3)<<*(*(p+row)+col);//上面的已经改变了,这里自然不用变
		cout<<endl;
	}

5 鞍点

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列最小(也可能没有鞍点)。
测试输入:
1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

预期输出:
a[0][4]=5

#include <iostream>
using namespace std;
void col_min(int row,int address);
void row_max(int col);
int n,m;
int main ()
{
//initialize:
	cin>>n>>m;
	 int arr[n][m];
	 for(int i=0;i<n;i++)
	 {
	 	for(int e=0;e<m;e++)
	 	{
	 		cin>>arr[i][e];
		 }
	 }
//找到每一行的最大值
//-------------------------------
	for(int row=0;row<3;row++)
	{
		int temp_max_row=arr[row][0],address=0;
		for(int i=1;i<5;i++)
		{
			if(arr[row][i]>temp_max_row)
			{
				temp_max_row=arr[row][i];
				address=i;
			}
		}
	   //将这个最大值和它所在列各项比较,如果又为本列最小值,则cout
	   //---------------------------------------------
		int temp_min_col=arr[row][address],flag=1;
		for(int i=0;i<3;i++)
			if(arr[i][address]<temp_min_col)
				flag=0;
		if(flag)cout<<"a["<<row<<"]["<<address<<"]="<<temp_min_col;
	}
	return 0;
}

10 日期计算器

在这里插入图片描述

#include <iostream>
using namespace std;
int main ()
{
	int montharr[12]={31,28,31, 30, 31,30,31,31,30,31,30,31};
	int year,weekday;
	cin>>year>>weekday;
	int month,day;
	cin>>month>>day;
	if(year%4==0&&year%100!=0||year%400==0)
	montharr[1]=29;
	int total=0;
	for(int i=1;i<month;i++)
	{
		total+=montharr[i];	
	}
	total+=day-1;
	int result=(total%7)+weekday;
	if(result>7)
	result-=7;
	cout<<result;
	return 0;
}

12(自编)

用数组而非指针完成该题:
在这里插入图片描述

在这里插入代码片

8

oj习题

1 动态创建2维数组

	int n=9,m=8;
	int **p=new int* [n] ;
	for(int i=0;i<n;i++)
		p[i]=new int [m];
	for(int i=0;i<n;i++)
		delete p[i];
	delete []p;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值