目录
人民币
输入正整数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;