算法设计基础

  1. 编程求和: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;
    }

  2. 编写程序求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”);
    }

  3. 教材第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”);
    }

  4. 教材第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;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值