study in pta(水仙花数string用法)(2025.11.12)

7-11 水仙花数 - 实验5 循环结构(25计4班)

1·我的最终代码

#include <iostream>
#include <string>
#include <cmath>
using namespace std;



int main()
{   int n;
    cin>>n;

    int sum;
    string s;
    for(int j=pow(10,n-1);j<pow(10,n);j++)
        {s=to_string(j);
         sum=0;
         for(int i=0;i<j.size();i++)
            {int temp=s[i]-'0';
             sum+=pow(temp,n);
             
             }
          if(sum==j)
                 {cout<<j<<endl;
                 }
        }
    
    return 0;
}



2·其实我开始想过两种方法

(1)不用string

因为用string(字符数组)就是因为它方便计算数字的位数(比如100为三位我只要shuzi.size(),就可以计算),但我也可以自己写一个函数单独计算位数,比如下面这个:

int len(int n)
{   int cnt=0;
    do 
        {cnt++;
         n/=10;
        }while(n!=0);

    return cnt;
}

那完整代码就改

1.for(int i=0;i<j.size();i++)-->for(int i=0;i<len(j);i++)

2.再把string字符数组部分改成整型数组就完成了

3·但我还是决定把string的方式开发出来感觉会更简洁

下面那个代码是我测试用的其实和上面一样的,打出来是为了告诉你们一个代码一次写正确是很难的,通常要多次测试(一行一行测试)才能“完美”

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

/*int len(int n)
{   int cnt=0;
    do 
        {cnt++;
         n/=10;
        }while(n!=0);

    return cnt;
}*/

int main()
{   int n;
    cin>>n;

    int sum;
    //cout<<len(sum);
    string s;
    for(int j=pow(10,n-1);j<pow(10,n);j++)
        {s=to_string(j);
         sum=0;
         for(int i=0;i<s.size();i++)//len(j);i++)
            {int temp=s[i]-'0';
             //cout<<temp<<endl;
             sum+=pow(temp,n);//temp*temp*temp
             
             }
          if(sum==j)
                 {cout<<j<<endl;
                 }
        }
    
    return 0;
}//可以不用string直接加余数,但我想看看我现在怎么改可以对

4·这里我来讲一下用string的几个关键点

我先复制一下开始的代码!

#include <iostream>
#include <string>
#include <cmath>
using namespace std;



int main()
{   int n;
    cin>>n;

    int sum;
    string s;
    for(int j=pow(10,n-1);j<pow(10,n);j++)
        {s=to_string(j);
         sum=0;
         for(int i=0;i<j.size();i++)
            {int temp=s[i]-'0';
             sum+=pow(temp,n);
             
             }
          if(sum==j)
                 {cout<<j<<endl;
                 }
        }
    
    return 0;
}



(1)string为字符数组,本质储存的是ASCII 码

### **C++中ASCII码的全称**  
**ASCII** 的全称是 **American Standard Code for Information Interchange**(美国信息交换标准代码)。  

- 它是基于拉丁字母的一套电脑编码系统,用于表示文本信息,包含 **128个字符**(0-127),涵盖英文字母、数字、标点符号及控制字符。  
- 在C++中,字符类型(如 `char`)本质上存储的就是ASCII码值,例如 `'A'` 的ASCII码为65,`'0'` 为48。

所以如果你想要输出string[0]中你原本储存的1,就要输出string[0]-'0';

(2)如果想把string转为long long可以用:stoll(string的变量名)

                        int     转为string      就用上面我写的:to_string(int的变量名)

感谢观看

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值