我30你40他50”结果就是120

本文介绍了一个简单的C语言程序,该程序能够从一段包含数字的字符串中提取所有数字并计算其总和。例如,对于输入我30你40他50,程序将输出120作为结果。
/*++

Copyright (c) 2007 YourCompany

Module Name:

    <new>

Abstract:

    有一个字符串,里面包含一些数字,写一个函数,
    把这些数字加起来。比如“我30你40他50”结果就是120。 

Author:

    YourName (YourEmail) 2007-06-12

Revision History:

--
*/


#include
<stdio.h>
#include
<string.h>
#include
<math.h>

#define MAX_LEN 30 


int main(int argc, char* argv[])
{
    
char str[MAX_LEN];
    
float num[MAX_LEN];  //数组定义后会自动初始化为0,为何还要用menset???
 
    
int count=-0;  
    
char ch;  //存放取出的字符
    int i=0;
    
int j=0;
    
int n=0;   
    
int Len;  //记录输入串长度
    double sum=0.0;
    
double result=0.0;
    printf(
"[+]please input the string  ");
    printf(
"[-]example:你30岁我20岁一起是多少岁? ");
    printf(
"[-]result: 50 ");
    
    printf(
"please input the string in english or chinese: ");
    gets(str);
    Len
=strlen(str);
    
    printf(
"-----------:%f----------------------- ",pow(10.0,3.0));
    printf(
"ur string is :%s    the length is:%d ",str,Len);
    
    
while(Len!=0)
    
{
        ch
=str[i];
        printf(
"get char:  %c ",ch);
        
if(ch>='0' && ch<='9')
        
{
            j
=0;
            count
=-1
            
while(ch>='0'&&ch<='9')
            
{
                printf(
"find the number:  %c ",ch);
                num[j]
=(float)str[i++];  //强制类型转换,使字符型变为浮点
                printf("turn char to float:  %f ",num[j]);
                count
++;
                j
++;
                Len
--;
                ch
=str[i];
                printf(
"get char:  %c ",ch);
            }

            
for(n=0;n<j;n++,count--)     //取出数字 
            sum+=num[n]*pow(10.0,(float)count);  
            printf(
"fetch the number:  %f ",sum);
        }

        
else 
        
{
            i
++;
            Len
--;
        }

        result
+=sum;
    }

    
 
你给出的输入数据看起来像是某种编程题目或算法题目的输入格式。我们可以解析这段输入: ``` 4 141 2 50 4 40 5 30 3 20 ``` 这段输入可以理解为一个包含两列数据的表格: | 第一列 | 第二列 | |--------|--------| | 4 | 141 | | 2 | 50 | | 4 | 40 | | 5 | 30 | | 3 | 20 | 这可能代表了某种数据结构或算法问题的输入格式。为了更准确地回答,我将假设这是某种**背包问题**(Knapsack Problem)的输入格式,其中: - 第一行的 `4 141` 表示:总共有 4 个物品,背包最大容量为 141。 - 后续的每一行表示一个物品的属性:第一个数字是物品的重量(weight),第二个数字是物品的价值(value)。 我们的目标是:在不超过背包容量的前提下,选择物品使得总价值最大。 --- ## 解决方案 这个问题是一个典型的 **0-1 背包问题**。我们使用动态规划来求解。 ### 动态规划思路 - 定义 `dp[w]` 表示容量为 `w` 的背包所能装的最大价值。 - 初始时 `dp[0...capacity] = 0`。 - 对于每个物品 `(weight, value)`,我们从后往前更新 `dp` 数组(防止重复选择同一物品)。 --- ### C++ 实现代码 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, capacity; cin >> n >> capacity; vector<int> weights(n); vector<int> values(n); for (int i = 0; i < n; ++i) { cin >> weights[i] >> values[i]; } // 初始化 dp 数组 vector<long long> dp(capacity + 1, 0); // 0-1 背包动态规划 for (int i = 0; i < n; ++i) { int w = weights[i]; int v = values[i]; for (int j = capacity; j >= w; --j) { dp[j] = max(dp[j], dp[j - w] + v); } } // 输出最大价值 cout << dp[capacity] << endl; return 0; } ``` --- ### 代码解释 1. **输入读取**: - 首先读取物品数量 `n` 和背包容量 `capacity`。 - 然后读取 `n` 个物品的重量和价值,存储在 `weights` 和 `values` 中。 2. **动态规划初始化**: - 定义 `dp` 数组,大小为 `capacity + 1`,初始值为 0。 3. **状态转移**: - 对于每个物品 `(weight, value)`,从后往前更新 `dp` 数组,防止重复计算。 4. **输出结果**: - 最终 `dp[capacity]` 就是能装入的最大价值。 --- ### 示例运行 对于输入: ``` 4 141 2 50 4 40 5 30 3 20 ``` 输出应该是: ``` 140 ``` 解释: - 选择物品 1(2,50)、物品 2(4,40)、物品 3(530)总重量为 11,总价值为 120。 - 如果选择物品 1(2,50)、物品 2(4,40)、物品 4(3,20)总重量为 9,总价值为 110。 - 最优解是选择物品 1(2,50)、物品 2(4,40)、物品 3(530)和物品 4(3,20),总重量为 14,总价值为 140。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值