标题:[全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战
只看楼主
yandongdido
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-9-6
得分:0 
5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。

#include<iostream.h>
void transfrom(int n,int base)
{
int num[20],i=0,j,m=n;
do
{
i++;
num[i]=m%base;
m=m/base;
}while(m!=0);
cout<<"**"<<n<<"转化为"<<base<<"进制的结果为:";
for(j=i;j>=1;j--)
if(num[j]<10) cout<<num[j];
else cout<<char(num[j]+'A'-10);
cout<<endl;
}
void main()
{
int n,choice;
cout<<"输入一个整数"; cin>>n;
do
{
cout<<"输入需要转化的进制:2-9,11-16";
cin>>choice;
switch(choice)
{
case 2:transfrom(n,2);
break;
case 3:transfrom(n,3);
break;
case 4:transfrom(n,4);
break;
case 5:transfrom(n,5);
break;
case 6:transfrom(n,6);
break;
case 7:transfrom(n,7);
break;
case 8:transfrom(n,8);
break;
case 9:transfrom(n,9);
break;
case 11:transfrom(n,11);
break;
case 12:transfrom(n,12);
break;
case 13:transfrom(n,13);
break;
case 14:transfrom(n,14);
break;
case 15:transfrom(n,15);
break;
case 16:transfrom(n,16);
break;
default:cout<<""<<endl;
}
} while(choice!=0);
return ;
}

2007-09-06 21:53
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
练习了用二维数组做参数传递

3. 打印一个 N*N 的方阵,N为每边 N=15 打印出下面图形
字符的个数(3<N<20), 要求最 TTTTTTTTTTTTTTT
外一层为"T", 第二层为"J", 从第三层 TJJJJJJJJJJJJJT
起每层依次打印数字 1,2,3,... TJ11111111111JT
(右图以N为15为例) TJ12222222221JT
TJ12333333321JT
TJ12344444321JT
TJ12345554321JT
TJ12345654321JT
TJ12345554321JT
TJ12344444321JT
TJ12333333321JT
TJ12222222221JT
TJ11111111111JT
TJJJJJJJJJJJJJT
TTTTTTTTTTTTTTT

#include <iostream>
#include <cassert>
using namespace std;

void setvalue(int (*a)[19], int n, int d, int value);
void show(int (*a)[19], int n);

int main()
{
int n, d = 0;
int a[19][19] = {0};
cout << "Please input N (3 < N < 20): ";
cin >> n;
assert((n>3) && (n<20));
cout << endl;

while (d <= (n+1)/2) // 1,2,3,……
{
setvalue(a, n, d, d-1); // 其中 'T' 用 -1 代替,'J' 用 0 代替
d++;
}

show(a, n);
}

void setvalue(int (*a)[19], int n, int d, int value)
{
for (int i=d; i<=n-1-d; i++)
{
a[d][i] = a[n-1-d][i] = value;
a[i][d] = a[i][n-1-d] = value;
}
}

void show(int (*a)[19], int n)
{
for (int i=0; i<=n-1; i++)
{
for (int j=0; j<=n-1; j++)
{
if (a[i][j] == -1)
cout << "T "; // 显示时变回来
else if (a[i][j] == 0)
cout << "J ";
else
cout << a[i][j] << " ";
}
cout << endl;
}
}

[此贴子已经被作者于2007-9-8 8:10:11编辑过]


C++学习
2007-09-07 15:15
曦木
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-8-29
得分:0 

第三题:(
// 矩阵.cpp : 定义控制台应用程序的入口点。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;//矩阵的长和宽
char s[20][20];
char ss[]={'T','J','0','1','2','3','4','5','6','7'};
input: cout<<"请输入矩阵的长宽(长和宽不小于3,不大于20):";
cin>>n;
cout<<endl;
if(n<3||n>20)
{
cout<<"不符合要求的输入,请重新输入"<<endl;
goto input;
}
else
if(n%2!=0)
{
for(int i=0;i<=n/2;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(j==i&&k>=j&&k<=n-j-1)
{
s[j][k]=ss[i];
s[n-j-1][k]=ss[i];
}
if(k==i&&j>=k&&j<=n-k-1)
{
s[j][k]=ss[i];
s[j][n-k-1]=ss[i];
}
}
}
if(n%2==0)
{
for(int i=0;i<n/2;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(j==i&&k>=j&&k<=n-j-1)
{
s[j][k]=ss[i];
s[n-j-1][k]=ss[i];
}
if(k==i&&j>=k&&j<=n-k-1)
{
s[j][k]=ss[i];
s[j][n-k-1]=ss[i];
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(j==n-1)
cout<<s[i][j]<<endl;
else
cout<<s[i][j];
}
cout<<"继续请输如1,退出请输入其他:";
int a=0;
cin>>a;
if(a==1)
goto input;
system("pause");
}




2007-09-11 17:21
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
纯数学方法找规律

6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:

① 倒填,例如N=5 ② 蛇形填数 ③ 回转填数

┌—┬─—┬─┬─—┬─—┐ ┌─┬─—┬—┬—─┬—┐ ┌─—┬─┬—─┬—┬─—┐
│25 │24 │23 │22 │21 │ │ 1 │ 3 │ 4 │10 │11 │ │ 1 │16 │15 │14 │13 │
├─┼─—┼─┼—─┼─—┤ ├─┼——┼─┼—─┼—┤ ├——┼—┼─—┼─┼——┤
│20 │19 │18 │17 │16 │ │ 2 │ 5 │ 9 │12 │19 │ │ 2 │17 │24 │23 │12 │
├—┼—─┼─┼─—┼─—┤ ├─┼——┼─┼——┼─┤ ├─—┼─┼─—┼─┼——┤
│15 │14 │13 │12 │11 │ │ 6 │ 8 │13 │18 │20 │ │ 3 │18 │25 │22 │11 │
├—┼—─┼——┼─┼─—┤ ├—┼─—┼—┼─—┼—┤ ├─—┼—┼——┼─┼——┤
│10 │ 9 │ 8 │ 7 │ 6 │ │ 7 │14 │17 │21 │24 │ │ 4 │19 │20 │21 │10 │
├─┼─—┼─—┼—┼—─┤ ├—┼─—┼—┼─—┼—┤ ├─—┼─┼─—┼—┼——┤
│ 5 │ 4 │ 3 │ 2 │ 1 │ │15 │16 │22 │23 │25 │ │ 5 │ 6 │ 7 │ 8 │ 9 │
└—─┴─┴─—┴─┴─—┘ └─┴─—┴─┴─—┴—┘ └─—┴─┴─—┴—┴─—┘

蛇形分析:
1.对称,a[0][0]+a[4][4]=26, a[i][j]+a[4-i][4-j]=26

2.数字金字塔如下:
1
2 3
4 5 6 第i行行尾数:tail = i*(i+1)/2
7 8 9 10 顺序排列还是逆序排列,得看i的奇偶性

#include <iostream>
#include <iomanip>
#include <cassert>
using namespace std;

void setvalue1(int (*a)[11], int n);
void setvalue2(int (*a)[11], int n);
void setvalue3(int (*a)[11], int circle, int value, int n);
void show(int (*a)[11], int n);

int main()
{
int n;
cout << "Input the class n (1~10): ";
cin >> n;
assert((n >= 1) && (n <= 10));
cout << endl;

int a[11][11];
setvalue1(a,n);
cout << setw(2) << n << "阶倒填矩阵:" << endl;
show(a,n);

setvalue2(a,n);
cout << setw(2) << n << "阶蛇形矩阵:" << endl;
show(a,n);

setvalue3(a,0,1,n);
cout << setw(2) << n << "阶回转矩阵:" << endl;
show(a,n);
}

void setvalue1(int (*a)[11], int n) //倒填
{
int max = n * n;
for (int i=0; i<=n-1; i++)
for (int j=0; j<=n-1; j++)
a[i][j] = max - n*i - j;
}

void setvalue2(int (*a)[11], int n) //蛇形填数
{
for (int i=0; i<=n-1; i++)
for (int j=0; j<=n-1-i; j++)
{
int s = i + j;
int tail = (s+1)*(s+2)/2; //数字金字塔行尾数计算, 金字塔的行 s 为数组行、列标和
a[i][j] = (s%2 == 0) ? (tail-j) : (tail-i); //蛇形排列与行数 s 有关
a[n-1-i][n-1-j] = n*n+1-a[i][j]; //关于 n*n+1 对称
}
}

void setvalue3(int (*a)[11], int circle, int value, int n) //回转填数
{
if (circle < n/2) //转第 circle+1 个圈, circle 从0开始
{
int i,j;
for (i=circle; i<n-1-circle; i++)
a[i][circle] = value++;
for (j=circle; j<n-1-circle; j++)
a[i][j] = value++;
for (i=n-1-circle; i>circle; i--)
a[i][j] = value++;
for (j=n-1-circle; j>circle; j--)
a[i][j] = value++;

setvalue3(a,circle+1,value,n); //递归填内圈
}

else if (n%2 != 0) //奇数阶数组中心的数
a[circle][circle] = value;
}

void show(int (*a)[11], int n)
{
for (int i=0; i<=n-1; i++)
{
for (int j=0; j<=n-1; j++)
cout << setw(4) << a[i][j];
cout << endl;
}
cout << endl;
}


C++学习
2007-09-13 15:40
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
得分:0 
来晚了,
这么多,只有边看边学习了

2007-09-14 01:31
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
回复:(HJin)/*----------------------------------...

To HJin:

你在62楼关于第10题的解答:


Analysis:

i | # of squares with side length i | total area
----+------------------------------------------------
n | 1^2 | n*1^2 //面积计算公式错误 n^2 * 1^2
n-1 | 2^2 | (n-1)*2^2 // (n-1)^2 * 2^2
n-2 | 3^2 | (n-2)*3^2 //……
.....................................................
2 | (n-2)^2 | 2*(n-2)^2
1 | n^2 | 1*n^2

total number of squares is 1^2 + 2^2 +... +n^2 = n*(n+1)*(2*n+1)/6
total area is 1*n^2 + 2*(n-1)^2 + ... + n*1^2 = n*(n+1)^2*(n+2)/12 //


Sample output:

n | # of squares | total area | # of squares 2 | total area 2
-----+--------------+--------------+----------------+---------------
1 | 1 | 1 | 1 | 1
2 | 5 | 6 | 5 | 6 // total area = 8,以下...
3 | 14 | 20 | 14 | 20
4 | 30 | 50 | 30 | 50
5 | 55 | 105 | 55 | 105
6 | 91 | 196 | 91 | 196
……


C++学习
2007-09-17 15:22
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
thanks, i think people already pointed out my mistakes.

but I did appreciated your time for finding my mistakes.

I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-17 15:48
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
我做这题跟你答案不一样,偶然发现,不是故意找茬

C++学习
2007-09-17 15:51
海子星竹
Rank: 1
等 级:新手上路
威 望:1
帖 子:58
专家分:0
注 册:2007-9-4
得分:0 

7.读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的
单词与以 N 结尾的单词,用头尾交换的办法予以置换。

#include<iostream>
#include<string>

using namespace std;

class Text
{
public:
Text(string p)
{
a = p;
}

void judge();

void show()
{
cout<<a<<endl<<endl;
}

private:
string a;
};

void Text::judge()
{
a = a.substr(0,a.find("%"));
if(a.at(0) == 'A' && a.at(a.length()-1) == 'N')
{
a.replace(0,1,"N");
a.replace(a.length()-1,1,"A");
}
}

int main ()
{
string b;
cout <<"输入:";
getline(cin,b);
Text a(b);
a.judge();
a.show();
return 0;

}

2007-09-19 15:09
且行且珍惜
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-9-17
得分:0 
第三题:
[CODE]public class print{
private static int N = 14;
public static void main(String args[] ){
int [][] a = new int[N][N];
int m;
if(N%2==0)
m=N/2-1;
else
m=N/2;
for(int i=0;i<=m;i++)
for(int j=i;j<=m;j++)
{
a[i][j]=i-1;


a[j][i]=a[i][j];
a[i][N-j-1]=a[i][j];
a[j][N-i-1]=a[j][i];
a[N-i-1][j]=a[i][j];
a[N-j-1][i]=a[j][i];
a[N-j-1][N-i-1]=a[j][i];
a[N-i-1][N-j-1]=a[i][j];
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(a[i][j]==-1)
System.out.print("T ");
else if(a[i][j]==0)
System.out.print("F ");
else
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}[/CODE]
2007-09-30 07:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-147967-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.336127 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved