D Digit Size

本文详细解读了HDOJ3575中的数字LC显示屏尺寸变换问题,通过实例分析了如何改变显示屏中数字的大小,并提供了实现该功能的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description
Digital LC-display is widely used in many different fields such as electronic calculator, electronic watch, digital instruments, etc. A simulated example of the numbers represented by digital LC-display device is shown as follows:

Each number represented by LC-display above is composed of s "-" signs for the horizontal segments and s "|" signs for the vertical ones, and each number exactly occupies s+2 columns and 2s+3 rows. Your task is to change the size of the original numbers by changing "s" — the number of signs.
 

Input
The first line of input contains a number t, which means there are t cases of the test data.
The input contains several lines, 2s + 4 for each number to be displayed. The first line of each case contains two integer s and t (1 <= s, t <= 9), where s is the original size of the numbers and t is the target size of numbers that you should output. The following 2s + 3 lines show the original number n (the digit of n will not exceed 9) you should deal with. Each digit of n will be separated by an empty column (except for the last digit).
 

Output
For each test case, output the case number and then output the target number according to the input. Output a blank line after each case.

——摘自HDOJ 3575(测试数据不好显示)


这道题题目不难!看了后题目大家都会有想法,是的,我承认不难,但想起自己当初(也才昨天而已)实现的时候真是太痛苦了!都怪自己审题不仔细,忽略了数据的大小。所以一开始时,存储输入数据的数组就只开了100*100, 呃。。写完后本地测试数据轻松过,但提交总是WA!这种情况是很郁闷的!当时改了一下午,空格换行之类的细节想得都快晕了!

到后来是心灰意冷,真没辙了。没办法了,就很无聊的把数据改大了点,草,竟奇迹般地过了。。Accept!!!有木有搞错啊……盼望了一下午啊!可还是高兴不起来,当时真的是哭笑不得。。

注意审题啊,切记……切记……


#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

int m,n;
char digit[1500][1500];

void f(int row)
{
     int i,j,k;
     int len = strlen(digit[row]);
     for(i=0; i*(m+2)+i-1<len; i++)
     {
              if(i != 0)
              printf(" ");
              printf(" ");
              for(j=0; j<n; j++)
              if(digit[row][(m+2)*i+i+1] == '-')
              printf("-");
              else printf(" ");
              printf(" ");
              }
              printf("\n");
     }
void g(int row)
{
     int i,j,k;
     int len = strlen(digit[row]);
     for(i=0; i*(m+2)+i-1<len; i++)
     {
              if(i != 0)
              printf(" ");
              printf("%c", digit[row][(m+2)*i+i]);
              for(j=0; j<n; j++)
              printf(" ");
              printf("%c", digit[row][i*(m+2)+i+m+1]);
              }
              printf("\n");
     }

int main()
{
    int cases, t;
    int i,j,k;
    
    scanf("%d", &cases);
    t = 1;
    while(t <= cases)
    {
            scanf("%d %d", &m, &n);
            
            getchar();
            for(i=0; i<2*m+3; i++)
             gets(digit[i]);

            
            printf("Case %d:\n", t);
            
            f(0);
            for(i=0; i<n; i++)
            g(1);
            f(m+1);
            for(i=0; i<n; i++)
            g(m+2);
            f(2*m+2);
            t++;
            //if(t != cases)
            printf("\n");
            }   
    return 0;
    }



% ==================================================== % 车牌数字识别BP神经网络实现 % 作者:MATLAB R2024a % 日期:2025-06-26 % 数据集路径:C:\Users\蓝喲\Desktop\车牌号码 % 文件命名格式:bule(1).jpg, bule(2).jpg 等 % ==================================================== % 清空环境 clear; close all; clc; warning off; % 配置参数 imageSize = [20, 20]; % 图像缩放尺寸 trainRatio = 0.8; % 训练集比例 hiddenLayerSize = 25; % 隐藏层神经元数量 maxEpochs = 1000; % 最大训练次数 minSamplesPerDigit = 5; % 每个数字所需的最小样本数 % 步骤1:加载并预处理数据 dataPath = 'C:\Users\蓝喲\Desktop\车牌号码'; [images, labels] = loadDigitData(dataPath, imageSize, minSamplesPerDigit); % 检查是否有足够的数据 if isempty(images) error('未找到足够的图像数据,请检查路径和文件命名格式'); end % 步骤2:划分训练集和测试集 [trainInd, testInd] = dividerand(size(images,4), trainRatio, 1-trainRatio); trainImages = images(:,:,:,trainInd); trainLabels = labels(trainInd); testImages = images(:,:,:,testInd); testLabels = labels(testInd); % 步骤3:创建BP神经网络 net = patternnet(hiddenLayerSize); net.trainParam.epochs = maxEpochs; net.trainParam.showWindow = true; net.divideParam.trainRatio = 1.0; % 使用手动划分的数据集 % 步骤4:训练网络 % 将图像数据重塑为2D矩阵 trainData = reshape(trainImages, [], size(trainImages,4))'; testData = reshape(testImages, [], size(testImages,4))'; % 转换标签为分类矩阵 trainTarget = full(ind2vec(trainLabels+1, 10))'; testTarget = full(ind2vec(testLabels+1, 10))'; % 训练网络 [net, tr] = train(net, trainData', trainTarget'); % 步骤5:测试网络性能 % 训练集预测 trainPred = net(trainData'); trainPred = vec2ind(trainPred') - 1; trainAccuracy = sum(trainPred == trainLabels) / numel(trainLabels); % 测试集预测 testPred = net(testData'); testPred = vec2ind(testPred') - 1; testAccuracy = sum(testPred == testLabels) / numel(testLabels); % 步骤6:显示结果 fprintf('\n===== 网络训练结果 =====\n'); fprintf('训练集大小: %d 样本\n', numel(trainLabels)); fprintf('测试集大小: %d 样本\n', numel(testLabels)); fprintf('训练集准确率: %.2f%%\n', trainAccuracy*100); fprintf('测试集准确率: %.2f%%\n', testAccuracy*100); % 显示每个数字的识别准确率 fprintf('\n===== 各数字识别准确率 =====\n'); for digit = 0:9 idx = testLabels == digit; if any(idx) acc = sum(testPred(idx) == digit) / sum(idx); fprintf('数字 %d: %.2f%% (%d/%d)\n', digit, acc*100, sum(testPred(idx) == digit), sum(idx)); end end % 随机选择9个测试样本显示 figure('Name', '测试样本识别结果', 'NumberTitle', 'off', 'Position', [100, 100, 900, 900]); for i = 1:9 idx = randi(numel(testLabels)); subplot(3,3,i); imshow(testImages(:,:,:,idx)); trueLabel = testLabels(idx); predLabel = testPred(idx); if trueLabel == predLabel title(sprintf('真实: %d\n预测: %d', trueLabel, predLabel), 'Color', 'g', 'FontSize', 12); else title(sprintf('真实: %d\n预测: %d', trueLabel, predLabel), 'Color', 'r', 'FontSize', 12); end end % 显示混淆矩阵 figure('Name', '混淆矩阵', 'NumberTitle', 'off'); plotconfusion(testTarget, net(testData')); title('测试集混淆矩阵'); % 显示网络结构 view(net); % ===== 辅助函数:加载数字数据 ===== function [images, labels] = loadDigitData(dataPath, targetSize, minSamples) % 获取所有子文件夹 colorDirs = dir(dataPath); colorDirs = colorDirs([colorDirs.isdir] & ~ismember({colorDirs.name}, {'.', '..'})); images = []; labels = []; digitCount = zeros(1, 10); % 跟踪每个数字的样本数 % 遍历每个颜色文件夹 for c = 1:numel(colorDirs) colorPath = fullfile(dataPath, colorDirs(c).name); imgFiles = dir(fullfile(colorPath, '*.jpg')); % 处理每个图像文件 for f = 1:numel(imgFiles) imgPath = fullfile(colorPath, imgFiles(f).name); try img = imread(imgPath); % 从文件名解析数字标签 (如"bule(5).jpg"中的5) [~, fname] = fileparts(imgFiles(f).name); numStr = regexp(fname, '\((\d+)\)', 'tokens'); if isempty(numStr) % 尝试其他命名格式 (如"5_bule.jpg") numStr = regexp(fname, '^(\d+)_', 'tokens'); end if ~isempty(numStr) digitLabel = str2double(numStr{1}{1}); % 确保标签在0-9范围内 if digitLabel >= 0 && digitLabel <= 9 % 预处理图像 processedImg = preprocessImage(img, targetSize); % 添加到数据集 images = cat(4, images, processedImg); labels = [labels; digitLabel]; digitCount(digitLabel+1) = digitCount(digitLabel+1) + 1; end end catch fprintf('警告: 无法读取或处理文件: %s\n', imgPath); end end end % 移除样本不足的数字 validDigits = find(digitCount >= minSamples) - 1; mask = ismember(labels, validDigits); images = images(:, :, :, mask); labels = labels(mask); % 显示数据集统计信息 fprintf('===== 数据集统计 =====\n'); fprintf('总样本数: %d\n', numel(labels)); for digit = validDigits fprintf('数字 %d: %d 样本\n', digit, sum(labels == digit)); end % 随机打乱数据集 idx = randperm(length(labels)); images = images(:,:,:,idx); labels = labels(idx); end % ===== 辅助函数:图像预处理 ===== function processedImg = preprocessImage(img, targetSize) % 转换为灰度图 if size(img, 3) == 3 img = rgb2gray(img); end % 二值化 - 使用自适应阈值处理光照变化 img = imbinarize(img, 'adaptive', 'Sensitivity', 0.5); % 反转颜色(确保数字为白色,背景为黑色) img = imcomplement(img); % 调整大小 processedImg = imresize(img, targetSize); % 转换为单精度浮点数 processedImg = im2single(processedImg); end以上代码出现错误:===== 数据集统计 ===== 总样本数: 40 数字 1: 5 样本 数字 2: 5 样本 数字 3: 5 样本 数字 4: 5 样本 数字 5: 5 样本 数字 6: 5 样本 数字 7: 5 样本 数字 9: 5 样本 错误使用 ind2vec (第 39 行) The data is not a row vector or cell array of row vectors. 出错 untitled (第 48 行) trainTarget = full(ind2vec(trainLabels+1, 10))';给我修改后的完整代码
06-27
RSA算法是一种公钥密码算法,其主要原理是基于大素数分解的困难性,实现加解密过程中涉及到大数运算。下面是一个使用C语言实现大数RSA算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <math.h> #include <ctype.h> #define MAX_DIGIT 1024 typedef struct { int digits[MAX_DIGIT]; int size; } BigNum; void initBigNum(BigNum *num) { int i; for (i = 0; i < MAX_DIGIT; i++) { num->digits[i] = 0; } num->size = 0; } void printBigNum(BigNum *num) { int i; for (i = num->size - 1; i >= 0; i--) { printf("%d", num->digits[i]); } printf("\n"); } void setBigNum(BigNum *num, char *str) { int len, i, j; initBigNum(num); len = strlen(str); for (i = len - 1, j = 0; i >= 0; i--, j++) { num->digits[j] = str[i] - '0'; } num->size = len; } void copyBigNum(BigNum *dest, BigNum *src) { int i; for (i = 0; i < src->size; i++) { dest->digits[i] = src->digits[i]; } dest->size = src->size; } void addBigNum(BigNum *result, BigNum *num1, BigNum *num2) { int i, carry = 0, sum; initBigNum(result); for (i = 0; i < num1->size || i < num2->size; i++) { sum = num1->digits[i] + num2->digits[i] + carry; result->digits[i] = sum % 10; carry = sum / 10; result->size++; } if (carry) { result->digits[result->size++] = carry; } } void subBigNum(BigNum *result, BigNum *num1, BigNum *num2) { int i, borrow = 0, diff; initBigNum(result); for (i = 0; i < num1->size || i < num2->size; i++) { diff = num1->digits[i] - borrow - num2->digits[i]; if (diff < 0) { borrow = 1; diff += 10; } else { borrow = 0; } result->digits[i] = diff; result->size++; } while (result->size > 1 && result->digits[result->size - 1] == 0) { result->size--; } } void mulBigNum(BigNum *result, BigNum *num1, BigNum *num2) { int i, j, carry = 0, product; initBigNum(result); for (i = 0; i < num1->size; i++) { carry = 0; for (j = 0; j < num2->size; j++) { product = num1->digits[i] * num2->digits[j] + carry + result->digits[i + j]; result->digits[i + j] = product % 10; carry = product / 10; } if (carry) { result->digits[i + j] = carry; } } result->size = i + j; while (result->size > 1 && result->digits[result->size - 1] == 0) { result->size--; } } void divBigNum(BigNum *quotient, BigNum *dividend, BigNum *divisor) { int i, j; BigNum temp, remainder; initBigNum(quotient); copyBigNum(&temp, dividend); while (temp.size >= divisor->size) { initBigNum(&remainder); remainder.size = temp.size; for (i = 0; i < temp.size; i++) { remainder.digits[i] = temp.digits[i]; } remainder.size = temp.size; for (i = 0; i < temp.size - divisor->size; i++) { remainder.digits[i + divisor->size] = remainder.digits[i]; } remainder.size += divisor->size; for (i = 0; i < divisor->size; i++) { remainder.digits[i] = 0; } while (remainder.size > 1 && remainder.digits[remainder.size - 1] == 0) { remainder.size--; } for (j = 9; j >= 0; j--) { setBigNum(divisor, "0"); divisor->digits[0] = j; mulBigNum(&temp, divisor, quotient); if (compareBigNum(&temp, &remainder) <= 0) { break; } } setBigNum(divisor, "0"); divisor->digits[0] = j; mulBigNum(quotient, divisor, quotient); subBigNum(&temp, &remainder, divisor); copyBigNum(&remainder, &temp); copyBigNum(&temp, &quotient); initBigNum(quotient); for (i = remainder.size - 1; i >= 0; i--) { quotient->digits[i] = temp.digits[i + remainder.size - divisor->size]; quotient->size++; } while (quotient->size > 1 && quotient->digits[quotient->size - 1] == 0) { quotient->size--; } } copyBigNum(quotient, &temp); while (quotient->size > 1 && quotient->digits[quotient->size - 1] == 0) { quotient->size--; } } void modBigNum(BigNum *result, BigNum *num, BigNum *modulus) { BigNum quotient; divBigNum(&quotient, num, modulus); mulBigNum(result, modulus, &quotient); subBigNum(result, num, result); } int compareBigNum(BigNum *num1, BigNum *num2) { int i; if (num1->size > num2->size) { return 1; } if (num1->size < num2->size) { return -1; } for (i = num1->size - 1; i >= 0; i--) { if (num1->digits[i] > num2->digits[i]) { return 1; } if (num1->digits[i] < num2->digits[i]) { return -1; } } return 0; } void powModBigNum(BigNum *result, BigNum *base, BigNum *exponent, BigNum *modulus) { BigNum temp; initBigNum(result); result->digits[0] = 1; result->size = 1; while (exponent->size > 0) { if (exponent->digits[0] % 2 == 1) { mulBigNum(&temp, result, base); modBigNum(result, &temp, modulus); } divBigNum(exponent, exponent, modulus); mulBigNum(&temp, base, base); modBigNum(base, &temp, modulus); } } void generateBigPrime(BigNum *result, int numDigits) { int i; BigNum candidate; initBigNum(result); initBigNum(&candidate); while (1) { for (i = 0; i < numDigits; i++) { candidate.digits[i] = rand() % 10; } candidate.digits[numDigits - 1] |= 1; candidate.size = numDigits; if (isPrime(&candidate)) { copyBigNum(result, &candidate); return; } } } int isPrime(BigNum *num) { int i; BigNum a, quotient, remainder, testNum; setBigNum(&testNum, "2"); if (compareBigNum(num, &testNum) <= 0) { return 1; } if (num->digits[0] % 2 == 0) { return 0; } setBigNum(&testNum, "1"); for (i = 0; i < 20; i++) { generateBigNum(&a, num->size - 1); if (compareBigNum(&a, &testNum) == 0) { a.digits[0] = 2; } if (compareBigNum(&a, num) >= 0) { a.digits[0] = num->digits[0] - 2; } powModBigNum(&remainder, &a, num, num); if (compareBigNum(&remainder, &testNum) != 0) { return 0; } } return 1; } void generateBigRSA(BigNum *p, BigNum *q, BigNum *n, BigNum *e, BigNum *d) { int numDigits = 256; BigNum phi, temp; initBigNum(p); initBigNum(q); initBigNum(n); initBigNum(e); initBigNum(d); generateBigPrime(p, numDigits); generateBigPrime(q, numDigits); mulBigNum(n, p, q); subBigNum(&temp, p, &temp); subBigNum(&phi, q, &temp); setBigNum(e, "65537"); divBigNum(d, &temp, e); powModBigNum(&temp, e, d, &phi); } void encryptRSA(BigNum *ciphertext, BigNum *message, BigNum *e, BigNum *n) { powModBigNum(ciphertext, message, e, n); } void decryptRSA(BigNum *plaintext, BigNum *ciphertext, BigNum *d, BigNum *n) { powModBigNum(plaintext, ciphertext, d, n); } int main() { BigNum p, q, n, e, d, plaintext, ciphertext, decryptedtext; char message[] = "Hello World!"; srand(time(NULL)); setBigNum(&plaintext, message); generateBigRSA(&p, &q, &n, &e, &d); printf("p = "); printBigNum(&p); printf("q = "); printBigNum(&q); printf("n = "); printBigNum(&n); printf("e = "); printBigNum(&e); printf("d = "); printBigNum(&d); encryptRSA(&ciphertext, &plaintext, &e, &n); printf("Ciphertext: "); printBigNum(&ciphertext); decryptRSA(&decryptedtext, &ciphertext, &d, &n); printf("Plaintext: "); printBigNum(&decryptedtext); return 0; } ``` 该示例代码实现了大数加、减、乘、除、取模、比较、幂模等基本操作,以及生成大素数、生成RSA公私钥、加密解密等操作。其中,大数操作采用数组实现,支持高精度计算。RSA算法的具体实现过程,包括生成公私钥、加密解密等,都是基于大数操作实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值