-
编程求和:s=a+aa+aaa+aaaa+ „„+aaaa„aaa(n个),其中a为1~9中的一个数字。 提示:若第一项为a , 以后每一项由前一项乘以10加上a递推得到,然后求和。
#include
using namespace std;
int main(){
int a,n,sum=0;
cin>>a;
cin>>n;
cout<<“a=”<<a<<" "<<“n=”<<n<<endl;
for(;n>0;n–)
{
sum=a+sum;
a=a+10*a;
}
cout<<“sum=”<<sum;
return 0;
} -
编写程序求500 以内的勾股弦数,即满足 c2=b2+a2的3个数,要求b>a。将所有符合要求的组合存入文本文件中,每个组合占一行。
#include
#include <stdio.h>
#include //ofstream类的头文件
using namespace std;
int main() {
ofstream mycout(“E:/temp.txt”);//定义ofstream类对象 并设置文件名为temp
int a = 1, b = 1, c = 1;
for (c = 1; c < 500; c++) {
for (b = 1; b < 500; b++) {
for (a = 1; a < 500; a++) {
if (a < b && cc == a * a + b * b) {
mycout << c << "" << c << “=” << a << “" << a << “+” <<
b << "” << b << endl;
}
}
}
}
mycout.close();
system(“pause”);
} -
教材第7页算法实现题目1-1 统计数字问题。
#include <stdio.h>
#include
using namespace std;
void main()
{
int n;
int i;
int number[10]; //借用数组存储每一个10进制数的出现次数
//初始化各数字次数为0
for (i = 0; i < 10; i++)
number[i] = 0;
cin >> n;
//将数进行位分解,将对应数的出现次数加1
for (i = 1; i <= n; i++)
{ int temp;
temp = i;
while (temp > 0)
{
number[temp % 10]++;
temp = temp / 10;//temp做去尾
}
}//输出
for (i = 0; i < 10; i++)
cout << number[i] << endl;
system(“pause”);
} -
教材第8页算法实现题1-2 字典排序问题。
/*2-2 字典序问题 递归调用
算法思想:给定一个k位字符串需要分两步计算:
1、计算所有小于k位字符串的总和
2、计算=k位,但是编码小于他的总和
令f(i,k)表示以第i个字符开头长度为k的字符串总个数
g(k)表示长度为k的所有字符串总个数
有:特殊情况f(i,1)=1
其他情况f(i,k)= 累加f(j,k-1),j从i+1到26
g(k)=累加f(i,k)=累加i(累加j f(j,k-1)),i=1 ~ 26,j=i+1 ~ 26
*/
#include
#include
#include <stdlib.h>
using namespace std;
int f(int i, int k) {//计算以i开头 长度为K位的总个数
int sum = 0;
if (k == 1)
return 1;
else {
for (int j = i + 1; j <= 26; j++) {
/f(i,k)= 累加f(j,k-1) ,j从i+1到26
例如x1x2x3x4 以x1开头长度为4的字符串
和以x2开头的三位字符串之间差了以x1
后面字符到字符z开头的四位字符串 /
sum += f(j, k - 1);
}
return sum;
}
}
int g(int k) {//计算长度为K的所有字符串的总个数
int sum = 0;
for (int i = 1; i <= 26; i++) {
sum += f(i, k);
}
return sum;
}
int calulate(string s) {
int sum = 0;
int k = s.length();
for (int i = 1; i < k; i++) {//第一步:计算所有小于k位的字符串的总和
sum += g(i);
}
int h = s[0] - ‘a’ + 1;//计算s中第一个字母 是26字符中的第几个字符
for (int i = 1; i < h; i++) {//第二步:计算以第一个字母打头长度为k的字符串个数并加到sum上
sum += f(i, k);
}
for (int i = 1, temp = h; i < k; i++) {//第三步:计算以h字符开头,剩下的所有的字符串个数
int n = s[i] - ‘a’ + 1;//n为当前首位字母为26位字符中的第几个
int length = k - i;//获取当前字符串长度
for (int j = temp + 1; j < n; j++) {//计算 从前一个首字母的后一位 到 当前首字母位置 包含的所有字符串个数并加到sum上
sum += f(j, length);
temp = n;
}
}
return sum + 1;//最后加上原字符串
}
int main(int argc, char argv) {
int n;
string s;
cin >> n;
int a[100];
for (int i = 0; i < n; i++) {
cin >> s;
a[i] = calulate(s);
}
for (int i = 0; i < n; i++) {
cout << a[i] << endl;
}
system(“pause”);
return 0;
}
算法设计基础
最新推荐文章于 2022-04-09 18:26:12 发布