1. 程式人生 > >字串轉數字被3整除

字串轉數字被3整除

第一題:

描述:輸入一個字串,比如12345,拆分組合轉數字,求它所有可以被3整除的最大數

12 ,345   :2

12,3,45 :3 

這裡用到了貪心演算法  和 一個規律:能被3整除的數的位數和也能被3整除:

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int maxthree(string str){
    if(str.size()==0) return 0;
    int res=0;
    int temp=0;
    for(int i=0 ;i<str.size();i++){
        int tmp=str[i]-'0';
        if(tmp%3==0){
            res+=1;
            temp=0;
        }
        else{
            temp +=tmp;
            if(temp%3==0){
            res+=1;
            temp=0;
            }
        }
    }
    return res;
}

void doit(){
    string str;
    getline(cin,str);
    int res=maxthree(str);
    cout << res << endl;
}

int main(){
    doit();
    //system("pause");
    return 0;

}
 

這個題用python做起來更簡單

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
line=sys.stdin.readline()
print line
print line.replace(' ','')
#trainlines = label_folder.read().splitlines()  #返回每一行的資料
a=int(line.split(' ')[0])
print a
m,c=0,0
for b in str(a):
    c=c+int(b)
    if c%3==0:
        m=m+1
        c=0
print(m)

當然上題中添加了好多無關程式碼,只是為了學習python的語法!

第二題:

題目描述:給定一個數列:1,12,123,…,12345678910,1234567891011…,找出指定區間能被3整除的個數。

輸入描述:輸入兩個數字l和r,代表數列的第l個數和第r個數

輸出描述:輸出區間內能被三整除的個數

例:
輸入:2 5

輸出:3

因為12,123,1234,12345中能被3整除的有3個。

分析:
一個數能被3整除的等價情況就是這個數的各個位上的數的和能被3整除。1234567….n 這些數中,每三個數中有兩個能被3整除,當n滿足n%3 == 2時,那麼最後一位數也能被3整除。因此本題的解題思路是,先判斷從 l 到 r 中間有多少個能被3整除即 (r/3-l/3)*2,再考慮邊界條件,當第 l 個能整除3時,ans++;當 r%3 == 2時,則最後一位 r 也能整除3,ans++。

#include<cstdio>  
#include<algorithm>  
#include<cstring>  
#include<cmath>  
#include<iostream>
#define LL long long   
using namespace std;
LL a, b;
int main()
{
    cin >> a >> b;
    LL ans = (b / 3 - a / 3) * 2;
    if (a % 3 == 0)  ans++;
    if ((b + 1) % 3 == 0)  ans++;
    cout << ans << endl;
    return 0;
}