經典問題(c++/python)素數、楊輝三角(金字塔型)、統計單詞數、簡單計算器、密碼安全程度、凱撒密碼加密、漢諾塔 (python課設實驗實例)-- biaobiao88

【編寫程序,輸人一個大於2的天然數,而後輸出小於該數字的全部素數組成的列表。】所謂素數,是指除了1和自身以外沒有其餘因數的天然數,最小的素數是2,後面依次是三、五、七、十一、13...python

c++代碼:ios

#include<iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
    int x;
    cin >> x;
    for(int i = 2;i < x;i++)
    {
        int flag = 0;
        for(int j = 2;j <= sqrt(i);j++)
        {
            if(i % j == 0)
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0)
            cout << i << " ";
    }
    cout << endl;
    return 0;
}

python代碼:c++

import math
a = input("請輸入一個大於2的整數:")

for i in range(2,int(a)):
    flag = 0
    for j in range(2,int(math.sqrt(i) + 1)):
        if i % j == 0:
            flag = 1
            break
    if flag == 0:
        print("{} ".format(int(i)))
print("\n")

【編寫程序,格式化輸出楊輝三角。】楊輝三角即二項式定理的係數表,各元素知足以下條件:第一列及對角線上的元素均爲1;其他每一個元素等於它上一行同一列元素與前一列元素之和。算法

c++代碼:編程

#include<bits/stdc++.h>
#define int long long
#define maxx 9999
using namespace std;
int a[maxx][maxx];
signed main()
{
    int n;
    cin >> n;
    //初始化邊 
    for(int i = 1;i <= n;i++)//先初始化第一列即對角線的數值,都爲1 
    {
        a[i][i] = 1;
        a[i][1] = 1;
    }
    
    //計算出楊輝三角的各個值 
    for(int i = 3;i <= n;i++)//從第三行第二列開始 
        for(int j = 2;j <= i - 1;j++)//每一行所擁有的列數最大值即爲當前行數減一 
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//楊輝三角的性質,當前元素的值=上一行同一列的值+上一行前一列的值 

    //輸出打印 
    for(int i = 1;i <= n;i++)//注意觀察如下兩個for循環的邊界條件,之和爲n,這有助於你的理解 
    {    
        for(int j = 1;j <= n - i;j++)//先打印空格 
            cout << " ";
        for(int k = 1;k <= i;k++)//再打印數值(數值後帶一個空格)  
            cout << a[i][k] << " ";
        cout << endl;
    }
    return 0;
}

python代碼:數組

import math
import numpy as np
n = eval(input("請輸入一個整數:"))
#a = np.zeros((n,n),dtype = np.int)
#下面使用了列表推導式。
array = [([0] * (n + 1)) for i in range(n + 1) ]#Python中正確的構造二維數組,應該使用列表推導式,這樣就很是Python:array = [ [0] * m for i in range(n) ],行和列的數必定要大於已知矩陣的行數和列數,否則會報列表越界等錯誤,這裏要格外的注意
for i in range(1,n + 1):
    array[i][i] = 1
    array[i][1] = 1
for i in range(3,n + 1):
    for j in range(2,i):
        array[i][j] = array[i - 1][j - 1] + array[i - 1][j]
for i in range(1,n + 1):
    for j in range(1,n - i + 1):
        print(" ",end = "")
    for k in range(1,i + 1):
        print(array[i][k],end = " ")
    print("\n",end = "")

【編程計算有固定工資收入的黨員每個月所交納的黨費。】安全

(0,3000] :工資基數3000元及如下者,交納工資基數的0.5%;函數

(3000, 5000] :工資基數3000~5000元者,交納工資基數的1%;加密

(5000,10000] :工資基數在5000~10000元者,交納工資基數的1.5%;spa

(10000,+) :工資基數超過10000元者,交納工資基數的2%。

 

 c++代碼:

#include<iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
    float x,y;
    cout << "請輸入有固定工資收入的黨員的月工資:";
    cin >> x;
    if(0 < x <= 3000)
        y = x * 0.005;
    if(3000 < x <= 5000)
        y = x * 0.01;
    if(5000 < x <= 10000)
        y = x * 0.015;
    if(x > 10000)
        y = x * 0.02;
    printf("月工資 = %.0f,交納黨費 = %.1f\n",x,y);
    return 0;
}

python代碼:

import math
x = eval(input("請輸入有固定工資收入的黨員的月工資:"))#輸入的時候使用eval函數的話,你鍵入什麼類型的值,待接收的變量就是什麼類型的值,不須要再進行轉換
if 0 < x <= 3000:
    y = x * 0.005
if 3000 < x <= 5000:
    y = x * 0.01
if 5000 < x <= 10000:
    y = x * 0.015
if x > 10000:
    y = x * 0.02
print("月工資 = {}".format(int(x)),end = '')
print("交納黨費 = {}".format(y))

【統計所輸入字符串中單詞的個數,單詞之間用空格分隔。】

 

 c++代碼:

#include<iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
    string str;
    cout << "請輸入字符串:";
    getline(cin,str);
    int len = str.length();
    int flag = 1;
    for(int i = 0;i < len;i++)
        if(str[i] == ' ')
            flag++;
    cout << "其中的單詞總數有:" << flag << endl;
    cout << "分別爲:" << endl;
    for(int i = 0;i < len;i++)
        if(str[i] != ' ' && str[i] != '.')
            cout << str[i];
        else
            cout << endl;
    return 0;
}
 

python代碼:

import math
str = input("請輸入字符串:")
len1 = len(str)
#print(len)
flag = 1
for i in range(len1):
    if str[i] == ' ':
        flag = flag + 1
print("其中的單詞總數有:{}\n分別爲:\n".format(int(flag)),end = '')
for i in range(len1):
    if(str[i] != ' ' and str[i] != '.'):
        print(str[i],end = '')
    else:
        print("\n",end = '')

【編程實現一個簡單的計算器。】要求輸入兩個操做數和一個操做符(+、-、*、/、%),根據操做符輸出運算結果。注意「/」和「%」運算符的零除異常問題。

 

 c++代碼:

#include<iostream>
#include<cmath>
#define int long long
using namespace std;

signed main()
{
    while(1)
    {
        double x,y,sum;
        char z;
        cout << "請輸入操做數x:";
        cin >> x;
        cout << "請輸入操做數y:";
        cin >> y;
        cout << "請輸入操做符:";
        cin >> z;
        if((z == '/' || z == '%') && y == 0)
        {
            cout << "分母=0,零除異常!" << endl;
            continue;
        }
        if(z == '+')
        {
            printf("計算結果爲:%.1lf\n",x + y);
            continue;
        }
        if(z == '-')
        {
            printf("計算結果爲:%.1lf\n",x - y);
            continue;
        }
        if(z == '*')
        {
            printf("計算結果爲:%.1lf\n",x * y);
            continue;
        }
        if(z == '/')
        {
            printf("計算結果爲:%.1lf\n",x / y);
            continue;
        }
        if(z == '%')
        {
            printf("計算結果爲:%.1lf\n",fmod(x,y));
            continue;
        }
    }
    return 0;
}

python代碼:

import math
x = eval(input("請輸入操做數x:"))
y = eval(input("請輸入操做數y:"))
z = input("請輸入操做符:")
if((z == '/' or z == '%') and y == 0):
    print("分母=0,零除異常!")
else:
    if(z == '+'):
        print("計算結果爲:{}".format(float(x + y)))
    if(z == '-'):
        print("計算結果爲:{}".format(float(x - y)))
    if(z == '*'):
        print("計算結果爲:{}".format(float(x * y)))
    if(z == '/'):
        print("計算結果爲:{}".format(float(x / y)))
    if(z == '%'):
        print("計算結果爲:{}".format(float(x % y)))

通常地,能夠做爲密碼字符的主要有數字、小寫字母、大寫字母和幾個標點符號

密碼安全強度主要和字符串的複雜程度有關係,

字符串中包含的字符種類越多,認爲其安全強度越高

按照這個標準,能夠把安全強度分爲強密碼、中高、中低、弱密碼。

其中,強密碼表示字符串中同時含有數字、小寫字母、大寫字母、標點符號這4類字符,

弱密碼表示字符串中僅包含4類字符中的1種。

中低強度密碼表示字符串中僅包含4類字符中的2種。

中高強度密碼表示字符串中僅包含4類字符中的3種。

【編寫程序,輸人一個字符串,輸出該字符串做爲密碼時的安全強度。】

 

 c++代碼:

#include<iostream>
#define int long long
using namespace std;

signed main()
{
    string str;
    int shu = 0,xiaoxie = 0,daxie = 0,fuhao = 0;
    cin >> str;
    int len = str.length();
    for(int i = 0;i < len;i++)
    {
        //數字 
        if(48 <= str[i] && str[i] <= 57)
            shu = 1;
        //大寫字母 
        if(str[i] <= 90 && str[i] >= 65)
            daxie = 1;
        //小寫字母 
        if(str[i] >= 97 && str[i] <= 122)
            xiaoxie = 1;
        //標點符號 
        if((str[i] >= 32 && str[i] <= 47)||(str[i] >= 58 && str[i] <= 64))
            fuhao = 1;
    }
    int sum = shu + daxie + xiaoxie + fuhao;
    if(sum == 1)
        cout << "弱密碼";
    if(sum == 2)
        cout << "中低密碼";
    if(sum == 3)
        cout << "中高密碼";
    if(sum == 4)
        cout << "強密碼";
    return 0;
}

python代碼:

import math
str = input("請輸入密碼:")
len1 = len(str)
shu = 0
daxie = 0
xiaoxie = 0
fuhao = 0
for i in range(len1):
    if(ord(str[i]) >= 48 and ord(str[i]) <= 57):
        shu = 1
    if(ord(str[i]) >= 65 and ord(str[i]) <= 90):
        daxie = 1
    if(ord(str[i]) >= 97 and ord(str[i]) <= 122):
        shu = 1
    if((ord(str[i]) >= 32 and ord(str[i]) <= 47) or (ord(str[i]) >= 58 and ord(str[i]) <= 64)):
        fuhao = 1
sum = shu + daxie + xiaoxie + fuhao
if sum == 1:
    print("弱密碼")
if sum == 2:
    print("中低密碼")
if sum == 3:
    print("中高密碼")
if sum == 4:
    print("強密碼")

附加python中經常使用的一些數字和字符轉換:

  1. 整數字符串轉換爲對應的整數:int('12')
  2. 小數字符串轉換爲對應小數:float('12.34')
  3. 數字轉換爲字符串:str(123.45)
  4. ASCII碼轉換爲相應字符:chr(97)
  5. 字符轉換爲響應ASCII碼:ord('a')

凱撒加密算法的原理:把明文中每一個英文字母替換爲該字母在宇母表中後面第k個字母。

若是後面第k個字符超出字母表的範圍,則把字母表首尾相接。

也就是字母Z的下一個字母是 A,字母z的下一個字母是a。

要求明文中的大寫字母和小寫字母分別進行處理,

大寫字母加密後仍爲大寫字母,小寫字母加密後仍爲小寫字母。

凱撒加密算法是一種經典加密算法,雖然抗攻擊能力很是弱,

如今也沒有很好的應用價值了,但其中的思路仍是值得借鑑的。

【編寫程序:輸入一個字符串做爲待加密的明文,而後輸入一個整數做爲凱撒加密算法的密鑰,最後輸出該字符串使用該密鑰加密後的結果。】

 c++代碼:

#include<iostream>
#define int long long
using namespace std;

signed main()
{
    /*
    下面給出加解密的公式:
    加密公式:f(a) = (a + n) mod 26
    解密公式:f(a) = (a + (26 - n)) % 26 
    */
    string str;
    int n;
    cout << "請輸入待加密的明文:";
    cin >> str;
    cout << "請輸入密鑰:";
    cin >> n; 
    int len = str.length();
    //加密 
    for(int i = 0;i < len;i++)
    {
        if(str[i] >= 'A' && str[i] <= 'Z')
            str[i] = ((str[i] - 'A') + n) % 26 + 'A';
        if(str[i] >= 'a' && str[i] <= 'z')
            str[i] = ((str[i] - 'a') + n) % 26 + 'a';
    }
    
    //解密
//    int nn = 26 - n;
//    for(int i = 0;i < len;i++)
//    {
//        if(str[i] >= 'A' && str[i] <= 'Z')
//            str[i] = ((str[i] - 'A') + nn) % 26 + 'A';
//        if(str[i] >= 'a' && str[i] <= 'z')
//            str[i] = ((str[i] - 'a') + nn) % 26 + 'a';
//    }
    cout << str;
    return 0;
}

python代碼:

import math
str = input("請輸入待加密的明文:")
s = list(str)#能夠先將字符串轉換成列表,而後再進行賦值操做,再將其轉變回來
n = eval(input("請輸入密鑰:"))
len1 = len(str)
for i in range(len1):
    if(ord(s[i]) >= ord('A') and ord(s[i]) <= ord('Z')):
        s[i] = chr(((ord(s[i]) - ord('A')) + n) % 26 + ord('A'))
    if(ord(s[i]) >= ord('a') and ord(s[i]) <= ord('z')):
        s[i] = chr(((ord(s[i]) - ord('a')) + n) % 26 + ord('a'))
str = ''.join(s)
print(str)

註釋:

str = "My friend and i hang out together"
str[14] = 'I'

當要實現以上兩個語句時,會發生錯誤:TypeError: 'str' object does not support item assignment

這種錯誤的緣由是string(區別於list)是一種不可變的數據類型,應該用str = str[:14] + 'I' + out_str[15:],代替上面的第二行便可

還有一種方法去解決這個錯誤:

s = '312141'
s[0] = '0'

也會報錯

由於,python中的字符串跟C++的有點不同,python的字符串是一種不可變對象(immutabel object),意味着只讀不寫,線程安全。C++的字符串咱們能夠直接使用s[0]='0’這種語法對字符串中的某個字符賦值,而python不能夠。

在python中,能夠先將字符串轉換成列表,而後再進行賦值操做,再將其轉變回來。

s = '312141'
t = list(s)
t[0] = '0'
s = ''.join(t)

 

聽說古代有一個梵塔,塔內有3個底座A、B、C,

A座上有64個盤子,盤子大小不等,大的在下,小的在上。

有一個和尚想把這64個盤子從A座移到C座,

但每次只能容許移動一個盤子。

在移動盤子的過程當中能夠利用B座,

但任什麼時候刻3個座上的盤子都必須始終保持大盤在下、小盤在上的順序。

若是隻有一個盤子,則不須要利用B座,直接將盤子從A移動到C便可。

【編寫函數,接收一個表示盤子數量的參數和分別表示源、目標、臨時底座的參數,而後輸出詳細移動步驟和每次移動後3個底座上的盤子分佈狀況。】

c++代碼:

 

python代碼:

相關文章
相關標籤/搜索